spring boot @Async异步注解上下文透传
在Spring Boot中,使用@Async
注解可以创建异步方法,但默认情况下,@Async
注解的方法是在独立的线程中执行的,它们不会自动地传递当前的Spring应用上下文。如果需要传递上下文,可以使用Executor
接口来自定义线程池,并通过Spring的ApplicationContext
来获取需要的bean。
以下是一个简单的例子,演示如何创建一个自定义的Executor
,并通过它来传递上下文:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.Executor;
@Configuration
public class AsyncConfig implements AsyncConfigurer {
@Bean(name = "threadPoolTaskExecutor")
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(5);
executor.setMaxPoolSize(10);
executor.setQueueCapacity(50);
executor.initialize();
return executor;
}
}
然后,在服务类中使用自定义的Executor
:
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.concurrent.Executor;
@Service
public class AsyncService {
private final Executor executor;
@Autowired
public AsyncService(@Qualifier("threadPoolTaskExecutor") Executor executor) {
this.executor = executor;
}
@Async("threadPoolTaskExecutor")
public void executeAsyncTask() {
// 异步执行的任务
}
}
在这个例子中,我们创建了一个名为threadPoolTaskExecutor
的Executor
bean,并在AsyncService
中注入了它。通过使用@Async("threadPoolTaskExecutor")
,我们指定了异步方法executeAsyncTask
应该在这个自定义的线程池中执行,这样就可以保持Spring应用上下文的传递。
评论已关闭