为什么要使用异步事件呢?就是为了快速响应前端的请求,让那些耗时较长的任务在后台独立执行,比如大量数据的导出,邮件发送等等。使用异步事件,可以很好地提高用户的体验。那么异步事件该如何使用呢,分为如下几步:
1.定义事件
定义一个事件类,继承ApplicationEvent;
import org.springframework.context.ApplicationEvent;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
/**
* 自定义spring事件基类,所有的事件继承该基类
*/
@Setter
@Getter
@ToString
public class CommonEvent extends ApplicationEvent {
private static final long serialVersionUID = -5824265251729348221L;
/** 事件的内容(具有实际业务意义的内容) */
private String eventContent;
public CommonEvent(Object source) {
super(source);
}
public CommonEvent(Object source, String eventContent) {
super(source);
this.eventContent = eventContent;
}
}
/**
* spring容器事件,封装所有的运行时异常事件
*/
public class BatchSendExMsgEmailEvent extends CommonEvent {
public BatchSendExMsgEmailEvent(Object source) {
super(source);
}
private static final long serialVersionUID = -1394667650154523969L;
}
2.发布事件
发布一个事件,使用ApplicationContext.publish(event);
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
ex.printStackTrace(pw);
// 发布运行时异常事件
BatchSendExMsgEmailEvent event = new BatchSendExMsgEmailEvent(this);
event.setEventContent(sw.toString());
applicationContext.publishEvent(event);
3.监听事件并且进行处理
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
@Component
public class ContainerEventListener {
private static final Logger logger = LoggerFactory.getLogger(ContainerEventListener.class);
@Autowired
private EmailService emailService;
@Value("${email_receivers}")
private String receivers;
@Value("${email_subject}")
private String emailSubject;
//@Async注解指定该事件异步执行,必须配合启动类的@EnableAsync
@Async
@EventListener
public void handleBatchSendExMsgEmailEvent(BatchSendExMsgEmailEvent event) {
logger.info("监听到了运行时异常事件");
emailService.batchSendSimpleMail(receivers, emailSubject, "具体的异常信息为: " + event.getEventContent());
}
}