DelegatingSecurityContextAsyncTaskExecutor 來完成SecurityContext包裝。DelegatingSecurityContextAsyncTaskExecutor 再包裝一層。@EnableAsync
@Configuration
public class AsyncConfig {
@Bean("taskExecutor")
public Executor taskExecutor(){
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
taskExecutor.setCorePoolSize(5);
taskExecutor.setMaxPoolSize(10);
taskExecutor.setQueueCapacity(100);
taskExecutor.setThreadNamePrefix("async-task-");
taskExecutor.initialize();
return new DelegatingSecurityContextAsyncTaskExecutor(taskExecutor);
}
}
// 這邊使用taskExecutor的Bean作為處理非同步執行緒的動作
@Async("taskExecutor")
public void sendNotifications(String msg, Boolean is_read, Instant create_time){
notificationDao.save(Notification.builder()
.user((User) SecurityContextHolder.getContext().getAuthentication().getPrincipal())
.msg(msg)
.is_read(is_read)
.create_time(create_time)
.build());
}
@Async 將該方法包裝成RunnableDelegatingSecurityContextAsyncTaskExecutor 取出原執行緒的身分並送交TaskExecutor執行。CompletableFuture 來包裝。void 即可。
本篇文章出自《每天學Java直到今年結束》Day244,大家可以到我的網站上查看~
iThome鐵人賽