上一篇添加了基礎的時間監聽機制
異步實現事件的監聽:
注意上面的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())); } }