Java 创建事件Event、事件监听EventListener、事件发布publishEvent
一、概述
個人認為,事件機制一般可由:事件源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)
下面是簡單的代碼實現
二、創建事件源
package com.xxxx.model; import lombok.Data;@Data public class User {private Long id;private String loginStatus; } package com.xxxx.model; import lombok.Data;@Data public class Order {private Long id;private Integer status; }三、創建事件對象
例如:訂單狀態事件,用戶狀態事件, 需要繼承ApplicationEvent
package com.xxxx.event;import com.xxxx.model.Order; import org.springframework.context.ApplicationEvent;public class OrderEvent extends ApplicationEvent {private Order order;public OrderEvent(Order order) {//ApplicationEvent 構造函數中必須傳入source對象, 官方注釋中被定義為最初發生事件的對象super(order);//方式二//super(order.getId());order = order;}public Order getOrder(){return order;} } package com.xxxx.event;import com.xxxx.model.User; import org.springframework.context.ApplicationEvent;public class UserEvent extends ApplicationEvent {private User user;public UserEvent(User user) {super(user);user = user;}public User getUser(){return user;} }四、事件監聽
方法上添加監聽事件的注解@EventListener
方法的參數為繼承ApplicationEvent的事件對象
五、事件發布
ApplicationContext應用上下文繼承了ApplicationEventPublisher,可以調用發布事件
package com.xxxx.event;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationEvent; import org.springframework.stereotype.Component;@Component public class EventPush {/*** ApplicationContext 繼承實現了 ApplicationEventPublisher, 可以直接發布事件*/@Autowiredprivate ApplicationContext applicationContext;@Asyncpublic void publishEvent(ApplicationEvent event){if (event instanceof OrderEvent) {applicationContext.publishEvent((OrderEvent) event);return;} else if(event instanceof UserEvent) {applicationContext.publishEvent((UserEvent) event);return;} else {//發布失敗}}@Asyncpublic void orderEventPush(OrderEvent event){applicationContext.publishEvent(event);}@Asyncpublic void userEventPush(UserEvent event){applicationContext.publishEvent(event);} }六、調用
注入依賴類
@Autowired private EventPush eventPush;調用事件發布
Order order = new Order(); order.setId(1000L); //0: 訂單創建成功 1:支付成功 ..... order.setStatus(1);User user = new User(); user.setId(1000L); //0: 退出成功 1:登錄成功 ..... user.setLoginStatus(1);//方式一: eventPush.orderEventPush(new OrderEvent(order)); eventPush.userEventPush(new UserEvent(user));//方式二: eventPush.publishEvent(new OrderEvent(order)); eventPush.publishEvent(new UserEvent(user));總結
以上是生活随笔為你收集整理的Java 创建事件Event、事件监听EventListener、事件发布publishEvent的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 研华IO卡C#调用
- 下一篇: java正则手机号_Java正则替换手机