91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring?Event觀察者模式事件監聽怎么使用

發布時間:2022-08-26 17:51:38 來源:億速云 閱讀:180 作者:iii 欄目:開發技術

這篇文章主要介紹“Spring Event觀察者模式事件監聽怎么使用”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Spring Event觀察者模式事件監聽怎么使用”文章能幫助大家解決問題。

Spring Event事件監聽

Spring Event(Application Event)其實就是一個觀察者設計模式,一個 Bean 處理完成任務后希望通知其它 Bean 或者說一個 Bean 想觀察監聽另一個Bean 的行為。在開發中我們經常就會遇到修改一個bean時,同時需要去修改其他得bean。或者說當一個bean得值發生變化時,需要修改另一個bean得業務。還有一些業務場景不需要在一次請求中同步完成,比如郵件發送、短信發送等。

MQ 確實可以解決這個問題,但 MQ比較重,非必要不提升架構復雜度。因此Spring Event是非常好得選擇。

依賴:引入Spring得核心依賴即可

Spring Event同步使用

自定義事件

定義事件,繼承 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)毫秒

Debug執行流程

Spring?Event觀察者模式事件監聽怎么使用

Spring?Event觀察者模式事件監聽怎么使用

Spring?Event觀察者模式事件監聽怎么使用

Spring?Event觀察者模式事件監聽怎么使用

Spring Event 異步使用

有些業務場景不需要在一次請求中同步完成,比如郵件發送、短信發送等。

自定義事件

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觀察者模式事件監聽怎么使用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

交城县| 迁西县| 浙江省| 定陶县| 霍山县| 九江市| 怀化市| 东安县| 揭西县| 惠水县| 化州市| 龙州县| 田林县| 庆元县| 军事| 南皮县| 桂平市| 西吉县| 武功县| 云梦县| 卢湾区| 亚东县| 赤壁市| 温宿县| 五常市| 巴中市| 靖宇县| 江门市| 亚东县| 屯门区| 建昌县| 南川市| 台北市| 和田市| 依安县| 横峰县| 电白县| 泰兴市| 锦州市| 麦盖提县| 金门县|