没错,本节主要讲的是Spring中事件机制:ApplicationEventPublisher,实现监听ApplicationEvent,最后利用事件通知实现通知实现异步操作
1、为什么要实现异步操作。
2、编程过程中有哪些可以去异步执行的
假如我们现在有一个需求,购买会员操作!先来分析具体步骤:
1、在会员用户列表添加该用户(代表该用户已经具有会员标示)
2、发送具体会员的权益
3、给用户添加积分操作
4、发送短信通知
假如有上四步,那么我们可以将发送短信通知作为异步操作。
public class SendMessageEvent extends ApplicationEvent {
private SendMessageEventDto sendMessageEventDto;
public SendMessageEvent(Object source) {
super(source);
}
public SendMessageEvent(Object source,SendMessageEventDto dto){
super(source);
this.sendMessageEventDto = dto;
}
public SendMessageEventDto getDto(){
return sendMessageEventDto;
}
public void setDto(SendMessageEventDto dto){
this.sendMessageEventDto = dto;
}
public class SendMessageEventDto{
/**
* 手机号
*/
private Integer userId;
/**
* 手机号
*/
private String mobile;
/**
* 短信模板参数数据体
*/
private String data;
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
}
}
复制代码
上面代码中首先定义发送短信的一个实体(SendMessageEventDto),将这个实体交给定义的事件管理(SendMessageEvent),该事件继承spring的ApplicationEvent
@Autowired
private ApplicationEventPublisher applicationEventPublisher;
/**
* 组装数据体异步发送短信
* @param mobile 手机号
* @param userId 用户ID
* @param jsonObject 短信所需参数
*/
public void publishMessage(String mobile,Integer userId,JSONObject jsonObject){
SendMessageEvent event = new SendMessageEvent(this);
SendMessageEvent.SendMessageEventDto dto = event.new SendMessageEventDto();
dto.setData(jsonObject.toString()); //具体业务的数据体
dto.setMobile(mobile);
dto.setUserId(userId);
event.setDto(dto);
//将事件交给spring监听
applicationEventPublisher.publishEvent(event);
}
复制代码
public interface SendMessageEventListener {
//发送短信
void sendMessage(SendMessageEvent sendMessageEvent);
}
复制代码
@Component
public class SendMessageEventListenerImpl implements SendMessageEventListener {
private Logger logger = LoggerFactory.getLogger(SendMessageEventListenerImpl.class);
@Autowired
private MiniProgramClient miniProgramClient;
@Override
@Async
@EventListener
public void sendMessage(SendMessageEvent sendMessageEvent) {
try {
SendMessageEvent.SendMessageEventDto dto = sendMessageEvent.getDto();
logger.error("发送短信通知开始 -> 数据体为 -> "+ JSON.toJSONString(dto));
MarketMessageDto messageDto = new MarketMessageDto();
messageDto.setUserId(dto.getUserId());
messageDto.setData(dto.getData());
messageDto.setMobile(dto.getMobile());
//调用短信服务,发送短信
miniProgramClient.sendMarketMsg(messageDto);
}catch (Exception e){
e.getMessage();
e.printStackTrace();
}
}
}
复制代码
这里特别注意的是,必须在需要被监听的方法上加上 @EventListener, 然后开启异步 @Async
public static void main(String[] args) {
//创建会员逻辑开始
//1、创建会员用户
//2、发送会员权益
//3、给用户添加积分
//4发送短信
publishMessage("176********",7465388,具体业务参数的json)
//返回结果
return "开通会员成功";
}
复制代码
OK,到这里就大功告成了,整体流程就是这样,这样当执行到给用户添加积分之后,就可直接返回成功,无须等待发送短信操作。
特别注意:在springBoot项目中使用的话,需要在启动类当中加入注解@EnableAsync
如果感觉对你有帮助的话,欢迎,点赞、分享加关注,后续我会输出更多技术干货,我们共同进步!
作者:苏世_
链接:
https://juejin.cn/post/6985049438540529694
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。