本文已参与好文召集令活动,点击查看:后端、大前端双赛道投稿,2万元奖池等你挑战!前端
今天是我在掘金的第五篇文章,感谢阅读,并但愿之后持续关注,我会输出更多技术干货,咱们共同进步!java
之后可能会分为几大专题,相似于并发专题,源码专题,面试专题等(只会分享干货)。面试
有兴趣的能够看下我上篇文章:一步一步教你用dockerspring
没错,本节主要讲的是Spring中事件机制:ApplicationEventPublisher,实现监听ApplicationEvent,最后利用事件通知实现通知实现异步操做docker
一、为何要实现异步操做。编程
二、编程过程当中有哪些能够去异步执行的json
假如咱们如今有一个需求,购买会员操做!先来分析具体步骤:后端
一、在会员用户列表添加该用户(表明该用户已经具备会员标示)markdown
二、发送具体会员的权益并发
三、给用户添加积分操做
四、发送短信通知
假若有上四步,那么咱们能够将发送短信通知做为异步操做。
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) {
//建立会员逻辑开始
//一、建立会员用户
//二、发送会员权益
//三、给用户添加积分
//4发送短信
publishMessage("176********",7465388,具体业务参数的json)
//返回结果
return "开通会员成功";
}
复制代码
OK,到这里就大功告成了,总体流程就是这样,这样当执行到给用户添加积分以后,就可直接返回成功,无须等待发送短信操做。
特别注意:在springBoot项目中使用的话,须要在启动类当中加入注解@EnableAsync
若是感受对你有帮助的话,欢迎,点赞、分享加关注,后续我会输出更多技术干货,咱们共同进步!
欢迎阅读上篇文章:一步一步教你用docker