spring事件機制(多線程異步監聽事件)


上一篇添加了基礎的時間監聽機制

異步實現事件的監聽:
注意上面的ApplicationListener 中的監聽機制為同步執行,即若發布兩個事件,則必須等待前一個事件完成才能繼續執行下一個事件,這里可以通過

spring的異步機制來實現:spring3.0版本開始支持@Async注解來實現異步調用。

新建一個線程配置類,此處兩點必須@EnableAsync注解和spring內置線程池ThreadPoolTaskExecutor:

@Configuration
@EnableAsync
public class ListenerAsyncConfiguration implements AsyncConfigurer
{
    /**
     * 獲取異步線程池執行對象
     * @return
     */
    @Override
    public Executor getAsyncExecutor() {
        //使用Spring內置線程池任務對象
        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
        //設置線程池參數
        taskExecutor.setCorePoolSize(5);//核心池大小
        taskExecutor.setMaxPoolSize(10);//最大線程數
        taskExecutor.setQueueCapacity(25);//隊列程度
        taskExecutor.setKeepAliveSeconds(100);//空閑時間
        taskExecutor.setThreadNamePrefix("Thread_Test");//線程前綴名稱
        taskExecutor.initialize();
        return taskExecutor;
    }

    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return null;
    }
}

監聽器中添加@Async注解:

@Component
public class UserRegisterEventListener implements ApplicationListener<UserRegisterEvent> {
    @Override
    @Async
    public void onApplicationEvent(UserRegisterEvent userRegisterEvent) {
        try {
            Thread.sleep(1000);//靜靜的沉睡3秒鍾
        }catch (Exception e)
        {
            e.printStackTrace();
        }
        System.out.println(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now()));
        System.out.println(String.format("接口模式給用戶[%S]發送郵件成功",userRegisterEvent.getUserName()));
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM