SpringBoot之异步事件

    为什么要使用异步事件呢?就是为了快速响应前端的请求,让那些耗时较长的任务在后台独立执行,比如大量数据的导出,邮件发送等等。使用异步事件,可以很好地提高用户的体验。那么异步事件该如何使用呢,分为如下几步:

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());

}

}

猜你喜欢

转载自williamwhj.iteye.com/blog/2355359