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

本文已参与好文召集令活动,点击查看:后端、大前端双赛道投稿,2万元奖池等你挑战!前端

今天是我在掘金的第五篇文章,感谢阅读,并但愿之后持续关注,我会输出更多技术干货,咱们共同进步!java

之后可能会分为几大专题,相似于并发专题,源码专题,面试专题等(只会分享干货)。面试

有兴趣的能够看下我上篇文章:一步一步教你用dockerspring

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

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

image.png

一、为何要实现异步操做。编程

  • 在微服务的状况下,多个服务互相调用,及其耗时,当咱们不须要此操做返回时,能够异步执行,调用接口,该接口快速返回,减小接口响应时长。
  • 代码逻辑性清晰,对于须要多个异步操做的能够实现事件的统一管理,不用建立线程池,减小资源的消耗

二、编程过程当中有哪些能够去异步执行的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

第二步,将事件经过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) {
     
     //建立会员逻辑开始
     
     //一、建立会员用户
     
     //二、发送会员权益
     
     //三、给用户添加积分
     
     //4发送短信
     publishMessage("176********",7465388,具体业务参数的json)
     
     //返回结果
     return "开通会员成功";
}
复制代码

OK,到这里就大功告成了,总体流程就是这样,这样当执行到给用户添加积分以后,就可直接返回成功,无须等待发送短信操做。

特别注意:在springBoot项目中使用的话,须要在启动类当中加入注解@EnableAsync

弦外之音

若是感受对你有帮助的话,欢迎,点赞、分享加关注,后续我会输出更多技术干货,咱们共同进步!

欢迎阅读上篇文章:一步一步教你用docker

相关文章
相关标签/搜索