您好,登錄后才能下訂單哦!
這篇文章主要介紹“Spring Event觀察者模式事件監聽怎么使用”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Spring Event觀察者模式事件監聽怎么使用”文章能幫助大家解決問題。
Spring Event(Application Event)其實就是一個觀察者設計模式,一個 Bean 處理完成任務后希望通知其它 Bean 或者說一個 Bean 想觀察監聽另一個Bean 的行為。在開發中我們經常就會遇到修改一個bean時,同時需要去修改其他得bean。或者說當一個bean得值發生變化時,需要修改另一個bean得業務。還有一些業務場景不需要在一次請求中同步完成,比如郵件發送、短信發送等。
MQ 確實可以解決這個問題,但 MQ比較重,非必要不提升架構復雜度。因此Spring Event是非常好得選擇。
依賴:引入Spring得核心依賴即可
定義事件,繼承 ApplicationEvent 的類成為一個事件類:
@Data public class OrderProductEvent extends ApplicationEvent { /** 該類型事件攜帶的信息 */ private String orderId; public OrderProductEvent(Object source, String orderId) { super(source); this.orderId = orderId; } }
監聽并處理事件,實現 ApplicationListener 接口或者使用 @EventListener 注解:
/** * 實現 ApplicationListener 接口,并指定監聽的事件類型 */ @Slf4j @Component public class OrderProductListener implements ApplicationListener<OrderProductEvent> { /** * 使用 onApplicationEvent 方法對消息進行接收處理 * * */ @SneakyThrows @Override public void onApplicationEvent(OrderProductEvent event) { String orderId = event.getOrderId(); long start = System.currentTimeMillis(); Thread.sleep(2000); long end = System.currentTimeMillis(); log.info("{}:校驗訂單商品價格耗時:({})毫秒", orderId, (end - start)); } }
發布事件,通過 ApplicationEventPublisher 發布事件:
@Slf4j @Service @RequiredArgsConstructor public class OrderService { /** 注入ApplicationContext用來發布事件 */ private final ApplicationContext applicationContext; /** * 下單 * * @param orderId 訂單ID */ public String buyOrder(String orderId) { long start = System.currentTimeMillis(); // 1.查詢訂單詳情 // 2.檢驗訂單價格 (同步處理) applicationContext.publishEvent(new OrderProductEvent(this, orderId)); long end = System.currentTimeMillis(); log.info("任務全部完成,總耗時:({})毫秒", end - start); return "購買成功"; } }
@SpringBootTest public class OrderServiceTest { @Autowired private OrderService orderService; @Test public void buyOrderTest() { orderService.buyOrder("732171109"); } }
c.l.l.event.OrderProductListener : 732171109:校驗訂單商品價格耗時:(2001)毫秒
c.llp.llpspringretry.event.OrderService : 任務全部完成,總耗時:(2005)毫秒
有些業務場景不需要在一次請求中同步完成,比如郵件發送、短信發送等。
import lombok.AllArgsConstructor; import lombok.Data; @Data @AllArgsConstructor public class MsgEvent { /** 該類型事件攜帶的信息 */ public String orderId; }
推薦使用 @EventListener 注解:
@Slf4j @Component public class MsgListener { @Async @SneakyThrows @EventListener(MsgEvent.class) public void sendMsg(MsgEvent event) { String orderId = event.getOrderId(); long start = System.currentTimeMillis(); log.info("開發發送短信"); log.info("開發發送郵件"); Thread.sleep(4000); long end = System.currentTimeMillis(); log.info("{}:發送短信、郵件耗時:({})毫秒", orderId, (end - start)); } }
@Slf4j @Service @RequiredArgsConstructor public class OrderService { /** 注入ApplicationContext用來發布事件 */ private final ApplicationContext applicationContext; /** * 下單 * * @param orderId 訂單ID */ public String buyOrder(String orderId) { long start = System.currentTimeMillis(); // 1.查詢訂單詳情 // 2.檢驗訂單價格 (同步處理) // applicationContext.publishEvent(new OrderProductEvent(this, orderId)); // 3.短信通知(異步處理) 新開線程執行監聽得業務 applicationContext.publishEvent(new MsgEvent(orderId)); long end = System.currentTimeMillis(); log.info("任務全部完成,總耗時:({})毫秒", end - start); return "購買成功"; } }
@EnableAsync開啟異步支持
@EnableAsync @EnableRetry @SpringBootApplication public class LlpSpringRetryApplication { public static void main(String[] args) { SpringApplication.run(LlpSpringRetryApplication.class, args); } }
c.llp.llpspringretry.event.OrderService : 任務全部完成,總耗時:(6)毫秒
c.llp.llpspringretry.event.MsgListener : 開發發送短信
c.llp.llpspringretry.event.MsgListener : 開發發送郵件
關于“Spring Event觀察者模式事件監聽怎么使用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。