Spring Boot 实现异步事件Event
转载
一、定义事件
public class SystemItemAlgorithmEvent extends ApplicationEvent {
@Getter
private final SystemItemAlgorithmParam systemItemAlgorithmParam;
public SystemItemAlgorithmEvent(SystemItemAlgorithmParam systemItemAlgorithmParam) {
super(systemItemAlgorithmParam);
this.systemItemAlgorithmParam = systemItemAlgorithmParam;
}
}
二、发布事件
@Resource
private ApplicationEventPublisher eventPublisher;
eventPublisher.publishEvent(new SystemItemAlgorithmEvent(param));
三、监听事件
@Slf4j
@Component
public class SystemItemAlgorithmListener {
@Resource
private LisLabSampleItemsMapper lisLabSampleItemsMapper;
@Resource
private LisLabTestService lisLabTestService;
/**
* 事务提交后监听
*
* @param event
*/
@Async(value = AsyncPoolConfig.TASK_EXECUTOR_NAME)
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT, classes = SystemItemAlgorithmEvent.class)
public void algorithmEditTrans(SystemItemAlgorithmEvent event) {
handleEvent(event);
}
/**
* 处理业务逻辑
*
* @param event
*/
private void handleEvent(event){
}
}
四、异步线程池配置
/**
* 异步线程池配置
*/
@Configuration
@EnableAsync
public class AsyncPoolConfig implements AsyncConfigurer {
public static final String TASK_EXECUTOR_NAME = "taskExecutor";
@Override
@Bean(TASK_EXECUTOR_NAME)
public AsyncTaskExecutor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
// 核心线程数(默认线程数)
executor.setCorePoolSize(10);
// 最大线程数
executor.setMaxPoolSize(20);
// 缓冲队列数
executor.setQueueCapacity(200);
// 允许线程空闲时间(单位:默认为秒)
executor.setKeepAliveSeconds(60);
// 线程池名前缀
executor.setThreadNamePrefix("asyncExecutor-");
// 设置是否等待计划任务在关闭时完成
executor.setWaitForTasksToCompleteOnShutdown(true);
// 设置此执行器应该阻止的最大秒数
executor.setAwaitTerminationSeconds(60);
// 增加 TaskDecorator 属性的配置
executor.setTaskDecorator(new ContextDecorator());
// 线程池对拒绝任务的处理策略
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
// 初始化
executor.initialize();
return executor;
}
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return null;
}
/**
* 任务装饰器
*/
class ContextDecorator implements TaskDecorator {
@Override
public Runnable decorate(Runnable runnable) {
RequestAttributes context = RequestContextHolder.currentRequestAttributes();
return () -> {
try {
// 传递上下文
RequestContextHolder.setRequestAttributes(context);
runnable.run();
} finally {
RequestContextHolder.resetRequestAttributes();
}
};
}
}
}
本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。