在Spring事件监听机制(二)中,我们提到了在SimpleApplicationEventMulticaster类的multicastEvent()方法发送事件广播时,有一个Executor对象,如果它不为空,就会异步去执行发送广播。那么本篇文章,我们来看一下如何去异步执行发送广播事件。
异步
一、自定义类直接继承SimpleApplicationEventMulticaster
这里我们为了方便看到执行效果,我们首先自定义一个事件:
public class MessageSendEvent extends ApplicationEvent {
/**
* Create a new ApplicationEvent.
*
* @param source the object on which the event initially occurred (never {@code null})
*/
public MessageSendEvent(Object source) {
super(source);
}
}
然后自定义一个发布器,去调用广播器发送广播的方法:
@Component
public class EventPublisher implements ApplicationContextAware {
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
public void publishEvent(ApplicationEvent event){
applicationContext.publishEvent(event);
}
}
接着定义三个事件监听者Listener,来监听我们自定义的事件:
MailSendListener.java
@Component
public class MailSendListener implements ApplicationListener<MessageSendEvent> {
@Override
public void onApplicationEvent(MessageSendEvent event) {
String dateStr = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
System.out.println(dateStr +">>>>>>>>> MailSendListener>>>>>>>>>>>> "+event);
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
SMSSendListener.java
@Component
public class SMSSendListener implements ApplicationListener<MessageSendEvent> {
@Override
public void onApplicationEvent(MessageSendEvent event) {
String dateStr = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
System.out.println(dateStr +">>>>>>>> SMSSendListener >>>>>>>>>>> "+event);
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
WechatSendListener.java
@Component
public class WechatSendListener implements ApplicationListener<MessageSendEvent> {
@Override
public void onApplicationEvent(MessageSendEvent event) {
String dateStr <