亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

SpringBoot如何發布ApplicationEventPublisher和監聽ApplicationEvent事件

發布時間:2021-08-25 11:14:20 來源:億速云 閱讀:223 作者:小新 欄目:編程語言

這篇文章給大家分享的是有關SpringBoot如何發布ApplicationEventPublisher和監聽ApplicationEvent事件的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

實現方法

  1. 自定義需要發布的事件類,需要繼承ApplicationEvent類或PayloadApplicationEvent<T>(該類也僅僅是對ApplicationEvent的一層封裝)

  2. 使用@EventListener來監聽事件

  3. 使用ApplicationEventPublisher來發布自定義事件(@Autowired注入即可)

/**
 * 自定義保存事件
 * @author peter
 * 2019/1/27 14:59
 */
public class PersonSaveEvent<DATA> extends ApplicationEvent {
  private DATA data;

  public PersonSaveEvent(DATA source) {
    super(source);
    this.data = source;
  }

  public DATA getData() {
    return data;
  }
}

//發布事件
public void savePerson(Person person){
  personDao.save(person);
  publisher.publishEvent(new PersonSaveEvent<>(1));
}
//監聽事件
@EventListener
public void listenEvent(PersonSaveEvent<Integer> event) {
   System.out.println("監聽到PersonSaveEvent事件; 接收到的值:" + event.getData() + ";發布的時間為" + Instant.ofEpochMilli(event.getTimestamp()));
}

好處

可以使核心業務與子業務進行解耦,也方便后期的業務的擴展。如新用戶注冊之后,需要發放優惠券,此時可以在保存用戶之后,發布一個新用戶的注冊成功事件,通過監聽該事件來實現發放優惠券的功能。后期新增一個對新用戶進行xxx功能,此時可以新寫一個監聽注冊成功事件的監聽器,來處理新的業務邏輯,而不需要修改之前的注冊邏輯。

注意事項

1、監聽器方法中一定要try-catch異常,否則會造成發布事件(有事物的)的方法進行回滾
2、可以使用@Order注解來控制多個監聽器的執行順序,@Order傳入的值越小,執行順序越高
3、對于需要進行事物監聽或不想try-catch runtime異常,可以使用@TransactionalEventListener注解

@TransactionalEventListener 監聽器

在該注解的源碼中:

 * <p>If the event is not published within the boundaries of a managed transaction, the
 * event is discarded unless the {@link #fallbackExecution} flag is explicitly set. If a
 * transaction is running, the event is processed according to its {@code TransactionPhase}.

大意是:如果事件的發布不是在事物(@Transactional)范圍內,則監聽不到該事件,除非將fallbackExecution標志設置為true(@TransactionalEventListener(fallbackExecution = true));如果在事物中,可以選擇在事物的哪個階段來監聽事件,默認在事物提交后監聽。

修改監聽事物的范圍:@TransactionalEventListener(phase = TransactionPhase.AFTER_COMPLETION)

在監聽器中重新開一個事物

 @TransactionalEventListener(phase = TransactionPhase.AFTER_COMPLETION)
  public void listenEvent1(PersonSaveEvent<Integer> event) {
    divide(event);
  }
  @Transactional(propagation = Propagation.REQUIRES_NEW)
  public void divide(PersonSaveEvent<Integer> event) {
    System.out.println("監聽到PersonSaveEvent事件; 接收到的值:" + event.getData() + ";接受的時間為" + Instant.ofEpochMilli(event.getTimestamp()));
  }

以上事件都是同步,如果需要異步則需要開啟異步支持,在監聽器方法加上@Async 注解即可。

/**
 * @author peter
 * @version 1.0
 * @date 2019/04/18 08:47
 */
@Configuration
@EnableAsync
public class AsyncEventConfiguration implements AsyncConfigurer {
  @Override
  public Executor getAsyncExecutor() {
    return Executors.newCachedThreadPool();
  }
}

一旦開始異步執行,方法的異常將不會拋出,只能在方法內部處理。

感謝各位的閱讀!關于“SpringBoot如何發布ApplicationEventPublisher和監聽ApplicationEvent事件”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

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

AI

赞皇县| 郎溪县| 玉田县| 彰化市| 浦城县| 小金县| 青川县| 安多县| 玛沁县| 玉溪市| 定安县| 河源市| 宁陵县| 固原市| 连南| 申扎县| 陈巴尔虎旗| 溧水县| 阳泉市| 营口市| 安康市| 漳浦县| 黔西县| 五寨县| 弋阳县| 航空| 镇赉县| 三台县| 噶尔县| 南宫市| 永康市| 余干县| 诸城市| 东兴市| 遵义市| 玉田县| 张掖市| 麟游县| 钟祥市| 婺源县| 抚宁县|