Async Methods

Learn about how to propagate Scope to Spring async methods.

Sentry's SDK for Java stores the scope and the context in a thread-local variable. To make sure that an async method has access to the correct Sentry context, a SentryTaskDecorator must be set on the ThreadPoolTaskExecutor.

To propagate Sentry scope to Spring MVC methods returning a Callable or a StreamingResponseBody, a ThreadPoolTaskExecutor decorated with SentryTaskDecorator must be set on the AsyncSupportConfigurer through an implementation of WebMvcConfigurer:

Copied
import org.springframework.context.annotation.Configuration; import org.springframework.core.task.AsyncTaskExecutor; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.web.servlet.config.annotation.AsyncSupportConfigurer; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;  import io.sentry.spring.SentryTaskDecorator;  @Configuration class AsyncWebMvcConfiguration implements WebMvcConfigurer {   @Override  public void configureAsyncSupport(AsyncSupportConfigurer configurer) {  configurer.setTaskExecutor(asyncExecutor());  }   private AsyncTaskExecutor asyncExecutor() {  ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();  executor.setTaskDecorator(new SentryTaskDecorator());  executor.initialize();  return executor;  } } 

To propagate Sentry scope to Spring @Async annotated methods, a custom AsyncConfigurerSupport must be configured to return a ThreadPoolTaskExecutor decorated with SentryTaskDecorator:

Copied
import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.AsyncConfigurerSupport; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;  import io.sentry.spring.SentryTaskDecorator;  import java.util.concurrent.Executor;  @Configuration class AsyncMethodConfiguration extends AsyncConfigurerSupport {  @Override  public Executor getAsyncExecutor() {  ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();  executor.setTaskDecorator(new SentryTaskDecorator());  executor.initialize();  return executor;  } } 
Was this helpful?
Help improve this content
Our documentation is open source and available on GitHub. Your contributions are welcome, whether fixing a typo (drat!) or suggesting an update ("yeah, this would be better").