Spring Boot 實現非同步事件Event
阿新 • • 發佈:2021-08-09
一、定義事件
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(); } }; } } }