<返回更多

SpringBoot利用监听事件,实现异步操作

2021-07-20  掘金  苏世
加入收藏

请出主角:Spring当中的事件机制

没错,本节主要讲的是Spring中事件机制:ApplicationEventPublisher,实现监听ApplicationEvent,最后利用事件通知实现通知实现异步操作

干货!SpringBoot利用监听事件,实现异步操作

 

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

第二步,将事件通过spring发布,由spring监听该事件

 @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
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>