• springBoot实现发布订阅


    应用场景:

    在开发中,有时需要监听某些事件,在事件触发时,执行相应的逻辑。

    也可以说是基于事件驱动的观察者模式。

    比如当点击某个按钮时,触发相应的功能,或者用户下单通知等等。

    SpringBoot 可以通过 ApplicationEvent 、ApplicationEventPublisher、@EventListener 实现事件的发布订阅。

    Event事件

    继承 ApplicationEvent,定义 Event事件。

    构造方法,需要加入一个父类的参数 source,表示事件的来源。source 参数传入事件来源,事件发生的对象,比如this。

    public class MyEvent extends ApplicationEvent {
    
        private String name;
    
        private String orderId;
    
        /**
         * 构造方法
         * @param source
         */
        public MyEvent(Object source) {
            super(source);
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getOrderId() {
            return orderId;
        }
    
        public void setOrderId(String orderId) {
            this.orderId = orderId;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    订阅事件

    通过 @EventListener 订阅事件,对事件进行监听。

    @Async 注解进行异步处理。

    @Slf4j
    @Component
    public class MyEventListener {
    
        @Async
        @EventListener(MyEvent.class)
        public void listener(MyEvent event) {
            log.info("listener event start");
            //执行事件对应的业务逻辑
            log.info("do something.");
        }
    }    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    发布事件:

    通过 ApplicationEventPublisher 发布事件。
    发布事件后,就会自动触发事件监听的逻辑。

    @Service
    public class EventPublisherService {
    
        @Resource
        private ApplicationEventPublisher publisher;
    
    
        public void doSomething() {
            //其他业务逻辑
    
            //发布事件
            //使用时传入事件来源,事件发生的对象,比如this
            MyEvent event = new MyEvent(this);
            event.setOrderId("12345");
            event.setName("orderQueue");
            publisher.publishEvent(event);
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
  • 相关阅读:
    (三)带权重和ignore_index的交叉熵损失函数
    Java(七)——集合框架---Set集合
    ​LeetCode解法汇总56. 合并区间
    java序列回显学习
    【C语言】你还不会指针吗?不妨来一起攻克指针这个难点
    服务器主机云主机在日常维护需要注意的几个点
    Vue3中的computed和watch属性
    打造人脸磨皮算法新标杆,满足企业多元化需求
    【java学习】this关键字(27)
    django后台启动CORS跨越配置
  • 原文地址:https://blog.csdn.net/sinat_32502451/article/details/133869867