1. 程式人生 > 其它 >Spring Boot 實現非同步事件Event

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();
                }
            };
        }
    }
}