当前位置:   article > 正文

Java 创建事件Event、事件监听EventListener、事件发布publishEvent_java publishevent

java publishevent

今天在看别人的代码时,看到Spring中事件发布publishEvent,所以特地查资料,学习一下,做个笔记。原文地址:Java 创建事件Event、事件监听EventListener、事件发布publishEvent_预立科技的博客-CSDN博客

一、概述
个人认为,事件机制一般可由:事件源source,事件对象Event,事件监听EventListener,事件发布publishEvent组成
事件源:引起事件发生的源; User用户信息, Order订单信息等为事件源数据,User登录状态loginStatus引起的事件, Order状态status引起的事件
事件对象:继承ApplicationEvent,事件对象包含事件源,事件对象也就是要被监听的对象; UserEvent, OrderEvent为事件对象,
事件监听:监听事件对象,事件对象被发布触发时,事件监听到后执行处理逻辑
事件发布:触发事件的发生


发布事件publishEvent后,EventListener监听到进行默认同步处理, 线程被阻塞, 这种同步方式吞吐量小耗时,不利用程序高并发。
在实际应用过程中,事件发布或事件监听后处理逻辑应该都是异步不阻塞线程。

publishEvent或EventListener 任意一个加上异步@Async即可(程序启动类必须要添加@EnableAsync)。推荐publishEvent加异步。
如果publishEven和EventListener过程中都有大量处理数据库或其他耗时的业务,也可以两者同时加上@Async

.

举例:
1.OrderEvent订单事件中,用户进行订单支付,订单支付逻辑处理完,同步返回给用户支付完成的消息,同时发布订单事件,异步处理订单发货逻辑等,这样可以将订单支付和订单发货解耦。
2.UserEvent用户事件中,用户登录成功后,同步返回给用户登录成功的消息,同时发布用户登录事件,异步处理用户登录后记日志登录日志, 写用户购物车缓存等逻辑

.

这种事件驱动机制其实是观察者模式(又称发布订阅)具体实现,事件对象(Event)相当于被观察对象(Subject), 事件监听(EventListener) 相当于观察者(Observer)

下面是简单的代码实现二、创建事件源

  1. import lombok.Data;
  2. @Data
  3. public class User {
  4.     private Long id;
  5.     private String loginStatus;
  6. }
  1. package com.xxxx.model;
  2. import lombok.Data;
  3. @Data
  4. public class Order {
  5. private Long id;
  6. private Integer status;
  7. }


三、创建事件对象
例如:订单状态事件,用户状态事件, 需要继承ApplicationEvent

  1. package com.xxxx.event;
  2. import com.xxxx.model.Order;
  3. import org.springframework.context.ApplicationEvent;
  4. public class OrderEvent extends ApplicationEvent {
  5. private Order order;
  6. public OrderEvent(Order order) {
  7. //ApplicationEvent 构造函数中必须传入source对象, 官方注释中被定义为最初发生事件的对象
  8. super(order);
  9. //方式二
  10. //super(order.getId());
  11. order = order;
  12. }
  13. public Order getOrder(){
  14. return order;
  15. }
  16. }


四、事件监听
方法上添加监听事件的注解@EventListener
方法的参数为继承ApplicationEvent的事件对象

  1. package com.xxxx.event;
  2. import com.xxxx.model.Order;
  3. import com.xxxx.model.User;
  4. import org.springframework.context.event.EventListener;
  5. import org.springframework.stereotype.Component;
  6. @Component
  7. public class EventListenerHandle {
  8.     /**
  9.      * EventListener 监听到OrderEvent事件,触发方法
  10.      * @param orderEvent
  11.      */
  12.     @Async
  13.     @EventListener
  14.     public void handle(OrderEvent orderEvent){
  15.         Order order = orderEvent.getOrder();
  16.         //getSource() 取决去构建OrderEvent时的super(source)
  17.         //Object object = orderEvent.getSource();
  18.         //处理订单业务
  19.         if(order.getStatus() == 0){
  20.         }else (order.getStatus() == 1){
  21.         }else {
  22.         }
  23.     }
  24.     /**
  25.      * EventListener 监听到UserEvent事件,触发方法
  26.      * @param userEvent
  27.      */
  28.     @Async
  29.     @EventListener
  30.     public void handle(UserEvent userEvent){
  31.         User user = userEvent.getUser();
  32.         
  33.         //处理用户业务
  34.         if(user.getLoginStatus() == 0){
  35.         }else (user.getLoginStatus() == 1){
  36.         }else {
  37.         }
  38.     }
  39. }


五、事件发布
ApplicationContext应用上下文继承了ApplicationEventPublisher,可以调用发布事件

  1. package com.xxxx.event;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.context.ApplicationContext;
  4. import org.springframework.context.ApplicationEvent;
  5. import org.springframework.stereotype.Component;
  6. @Component
  7. public class EventPush {
  8.     /**
  9.      * ApplicationContext 继承实现了 ApplicationEventPublisher, 可以直接发布事件
  10.      */
  11.     @Autowired
  12.     private ApplicationContext applicationContext;
  13.     @Async
  14.     public void publishEvent(ApplicationEvent event){
  15.         if (event instanceof OrderEvent) {
  16.             applicationContext.publishEvent((OrderEvent) event);
  17.             return;
  18.         } else if(event instanceof UserEvent) {
  19.             applicationContext.publishEvent((UserEvent) event);
  20.             return;
  21.         } else {
  22.             //发布失败
  23.         }
  24.     }
  25.     @Async
  26.     public void orderEventPush(OrderEvent event){
  27.         applicationContext.publishEvent(event);
  28.     }
  29.     @Async
  30.     public void userEventPush(UserEvent event){
  31.         applicationContext.publishEvent(event);
  32.     }
  33. }


六、调用
注入依赖类

  1. @Autowired
  2. private EventPush eventPush;


调用事件发布

  1. Order order = new Order();
  2. order.setId(1000L);
  3. //0: 订单创建成功  1:支付成功  .....
  4. order.setStatus(1);
  5. User user = new User();
  6. user.setId(1000L);
  7. //0: 退出成功  1:登录成功  .....
  8. user.setLoginStatus(1);
  9. //方式一:
  10. eventPush.orderEventPush(new OrderEvent(order));
  11. eventPush.userEventPush(new UserEvent(user));
  12. //方式二:
  13. eventPush.publishEvent(new OrderEvent(order));
  14. eventPush.publishEvent(new UserEvent(user));

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/153732
推荐阅读
相关标签
  

闽ICP备14008679号