本文主要介紹下如何在spring中進行發佈時間以及接收事件java
public class DemoEvent extends ApplicationEvent { private String message; public DemoEvent(Object source, String message) { super(source); this.message = message; } public String getMessage() { return message; } }
@Autowired private ApplicationEventPublisher applicationEventPublisher; @GetMapping("/send-event") public Object sendEvent(@RequestParam String msg){ DemoEvent demoEvent = new DemoEvent(this,msg); applicationEventPublisher.publishEvent(demoEvent); LOGGER.info("finish publish event"); return "success"; }
這裏在mvc中發佈,僅僅是爲了演示。spring
默認同步
)@Component public class DemoEventListener implements ApplicationListener<DemoEvent>{ private static final Logger LOGGER = LoggerFactory.getLogger(DemoEventListener.class); @Override public void onApplicationEvent(DemoEvent demoEvent) { LOGGER.info("receive event:{}",demoEvent.getMessage()); } }
這裏是同步接收mvc
@Configuration public class AsyncEventConfig { @Bean(name = "applicationEventMulticaster") public ApplicationEventMulticaster simpleApplicationEventMulticaster() { SimpleApplicationEventMulticaster eventMulticaster = new SimpleApplicationEventMulticaster(); eventMulticaster.setTaskExecutor(new SimpleAsyncTaskExecutor()); return eventMulticaster; } }
加上這個配置就ok了,否則要注意,這裏本身new的task executor,要優雅關閉的話,須要本身shutdownapp
spring-context-4.3.11.RELEASE-sources.jar!/org/springframework/context/event/SimpleApplicationEventMulticaster.java異步
@Override public void multicastEvent(ApplicationEvent event) { multicastEvent(event, resolveDefaultEventType(event)); } @Override public void multicastEvent(final ApplicationEvent event, ResolvableType eventType) { ResolvableType type = (eventType != null ? eventType : resolveDefaultEventType(event)); for (final ApplicationListener<?> listener : getApplicationListeners(event, type)) { Executor executor = getTaskExecutor(); if (executor != null) { executor.execute(new Runnable() { @Override public void run() { invokeListener(listener, event); } }); } else { invokeListener(listener, event); } } } private ResolvableType resolveDefaultEventType(ApplicationEvent event) { return ResolvableType.forInstance(event); }
能夠看到,使用applicationEventMulticaster的時候,若是有線程池,則用線程池異步執行;不然則知直接調用listener的執行方法同步執行。ide