【java框架】SpringBoot(11) — SpringBoot利用监听事件,实现异步操作

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

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

【java框架】SpringBoot(11) -- 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

Original: https://www.cnblogs.com/yif0118/p/15969490.html
Author: 人无名,则可专心练剑
Title: 【java框架】SpringBoot(11) — SpringBoot利用监听事件,实现异步操作

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/575913/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • SpringBoot 整合 MongoDB 实战解说

    在前面的文章中,我们详细的介绍了 MongoDB 的配置和使用,如果你对 MongoDB 还不是很了解,也没关系,在 MongoDB 中有三个比较重要的名词: 数据库、集合、文档!…

    数据库 2023年6月14日
    092
  • Mysql查询优化

    mysq查询l优化 指标:执行时间 检查的行数 返回的行数 explain关键字 — 实际SQL,查找用户名为Jefabc的员工 select * from emp where …

    数据库 2023年5月24日
    0120
  • 【StoneDB研发日志】union功能bug记录

    1、问题现象 create database syw_mtr; use syw_mtr; CREATE TABLE t1 (f1 VARCHAR(255) CHARACTER SE…

    数据库 2023年5月24日
    094
  • 私人菜谱

    红烧排骨食材:排骨一斤半 花椒葱姜蒜 豆瓣酱 生抽 耗油 白糖 两个大土豆步骤:少量油 花椒葱姜蒜(大块儿)爆香 一大勺豆瓣酱 倒入排骨翻炒一会儿 倒入一锅铲生抽 一小撮耗油撒一撮…

    数据库 2023年6月6日
    094
  • 【黄啊码】MySQL入门—1、SQL 的执行流程

    大家好!我是黄啊码,鉴于大家对于学习的热情,从今天起,将连载mysql的相关知识,需要学习的可以注意我的更新学习,后期估计会开启付费专栏,但当前完全可以白嫖,希望大家珍惜! 首先我…

    数据库 2023年6月16日
    087
  • 设计模式之(2)——工厂方法模式

    定义:工厂方法模式又称为工厂模式、多态工厂模式和虚拟构造器模式,通过定义工厂父类来定义创建对象的接口,而子类负责生成具体的对象; 主要作用:将类的实例化延迟到工厂类的子类中进行,由…

    数据库 2023年6月14日
    0106
  • Java面试题(八)–Spring

    1 基础知识 1、说说你对Spring的理解? 1、Spring是一个开源框架,主要是为简化企业级应用开发而生。可以实现EJB可以实现的功能,Spring是一个IOC和AOP容器框…

    数据库 2023年6月16日
    090
  • MySQL之group by分组查询

    有如下数据: 一个简单的分组查询案例 [En] A simple case of grouping query 按照部门编号deptno分组,统计每个部门的平均工资。 select…

    数据库 2023年5月24日
    0108
  • CentOS 7 Golang 安装

    可去官网下载tar包,这里提供一个1.16的安装地址: curl -#LO https://studygolang.com/dl/golang/go1.16.linux-amd64…

    数据库 2023年6月9日
    0123
  • B+树索引页大小是如何确定的?

    B+树简介 在正式介绍本文的主题前,需要对 B+ 树有一定的了解,B+树是一种磁盘上数据的索引结构,大概长这个样子。 B+树的叶子节点是所有的数据,非叶子节点称为索引页,索引页里有…

    数据库 2023年6月14日
    081
  • Spring boot 项目配置 Maven 资源文件分离打包

    需要引入三个Maven插件: maven-jar-plugin:用于打包代码,并去除不需要一起打包的resource文件 maven-assembly-plugin:主要用来打压缩…

    数据库 2023年6月9日
    085
  • Filter 过滤器

    什么是Filter过滤器? 1、Filter 过滤器它是 JavaWeb 的三大组件之一。三大组件分别是:Servlet 程序、Listener 监听器、Filter 过滤器2、F…

    数据库 2023年6月11日
    084
  • 每个开发人员都应该关注的7个优秀的GitHub仓库

    1. FreeCodeCamp 2. Developer Roadmap 3. Awesome 4. Build Your Own X 5. Git Ignore 6. Syste…

    数据库 2023年6月11日
    0105
  • Redis——数据操作(2)

    2022-09-21 (2)hash操作: ①设置多个hash值,(hmset): 查看说明: help hmset hmset person name A age 1 ②获得多个…

    数据库 2023年6月14日
    072
  • Mysql性能调优-工具篇

    首先祭出官方文档(这是5.7的,请自行选择版本): 如果你不想读英语,只需阅读这篇文章: [En] If you don’t want to read English,…

    数据库 2023年5月24日
    087
  • Django中使用QQ登录

    1.返回QQ登录网址的视图 请求方式: GET /oauth/qq/authorization/?next=xxx 请求参数: 查询字符串 参数名 类型 是否必须 说明 next …

    数据库 2023年6月14日
    0114
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球