最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解SpringBoot 發(fā)布ApplicationEventPublisher和監(jiān)聽(tīng)ApplicationEvent事件

 更新時(shí)間:2019年06月10日 11:46:58   作者:miskss  
這篇文章主要介紹了詳解SpringBoot 發(fā)布ApplicationEventPublisher和監(jiān)聽(tīng)ApplicationEvent事件,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

資料地址

Spring @Aync

實(shí)現(xiàn)方法

  1. 自定義需要發(fā)布的事件類(lèi),需要繼承ApplicationEvent類(lèi)或PayloadApplicationEvent<T>(該類(lèi)也僅僅是對(duì)ApplicationEvent的一層封裝)
  2. 使用@EventListener來(lái)監(jiān)聽(tīng)事件
  3. 使用ApplicationEventPublisher來(lái)發(fā)布自定義事件(@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;
  }
}

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

好處

可以使核心業(yè)務(wù)與子業(yè)務(wù)進(jìn)行解耦,也方便后期的業(yè)務(wù)的擴(kuò)展。如新用戶注冊(cè)之后,需要發(fā)放優(yōu)惠券,此時(shí)可以在保存用戶之后,發(fā)布一個(gè)新用戶的注冊(cè)成功事件,通過(guò)監(jiān)聽(tīng)該事件來(lái)實(shí)現(xiàn)發(fā)放優(yōu)惠券的功能。后期新增一個(gè)對(duì)新用戶進(jìn)行xxx功能,此時(shí)可以新寫(xiě)一個(gè)監(jiān)聽(tīng)注冊(cè)成功事件的監(jiān)聽(tīng)器,來(lái)處理新的業(yè)務(wù)邏輯,而不需要修改之前的注冊(cè)邏輯。

注意事項(xiàng)

1、監(jiān)聽(tīng)器方法中一定要try-catch異常,否則會(huì)造成發(fā)布事件(有事物的)的方法進(jìn)行回滾
2、可以使用@Order注解來(lái)控制多個(gè)監(jiān)聽(tīng)器的執(zhí)行順序,@Order傳入的值越小,執(zhí)行順序越高
3、對(duì)于需要進(jìn)行事物監(jiān)聽(tīng)或不想try-catch runtime異常,可以使用@TransactionalEventListener注解

@TransactionalEventListener 監(jiān)聽(tīng)器

在該注解的源碼中:

 * <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}.

大意是:如果事件的發(fā)布不是在事物(@Transactional)范圍內(nèi),則監(jiān)聽(tīng)不到該事件,除非將fallbackExecution標(biāo)志設(shè)置為true(@TransactionalEventListener(fallbackExecution = true));如果在事物中,可以選擇在事物的哪個(gè)階段來(lái)監(jiān)聽(tīng)事件,默認(rèn)在事物提交后監(jiān)聽(tīng)。

修改監(jiān)聽(tīng)事物的范圍:@TransactionalEventListener(phase = TransactionPhase.AFTER_COMPLETION)

在監(jiān)聽(tīng)器中重新開(kāi)一個(gè)事物

 @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("監(jiān)聽(tīng)到PersonSaveEvent事件; 接收到的值:" + event.getData() + ";接受的時(shí)間為" + Instant.ofEpochMilli(event.getTimestamp()));
  }

以上事件都是同步,如果需要異步則需要開(kāi)啟異步支持,在監(jiān)聽(tīng)器方法加上@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();
  }
}

一旦開(kāi)始異步執(zhí)行,方法的異常將不會(huì)拋出,只能在方法內(nèi)部處理。如需在方法外處理異常:Async 異常處理在文章最后

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java并發(fā)編程之線程池實(shí)現(xiàn)原理詳解

    Java并發(fā)編程之線程池實(shí)現(xiàn)原理詳解

    池化思想是一種空間換時(shí)間的思想,期望使用預(yù)先創(chuàng)建好的對(duì)象來(lái)減少頻繁創(chuàng)建對(duì)象的性能開(kāi)銷(xiāo),java中有多種池化思想的應(yīng)用,例如:數(shù)據(jù)庫(kù)連接池、線程池等,下面就來(lái)具體講講
    2023-05-05
  • 教你如何正確了解java三大特性!!!!

    教你如何正確了解java三大特性!!!!

    所有的面向?qū)ο缶幊陶Z(yǔ)言的思路都是差不多的,而這三大特性,則是思路中的支柱點(diǎn),接下來(lái)我就重點(diǎn)講解了一下java三大特性,感興趣的朋友跟隨腳本之家小編一起看看吧
    2021-07-07
  • mybatis plus自動(dòng)生成代碼tinyint(1)自動(dòng)轉(zhuǎn)換為Boolean的問(wèn)題及解決

    mybatis plus自動(dòng)生成代碼tinyint(1)自動(dòng)轉(zhuǎn)換為Boolean的問(wèn)題及解決

    這篇文章主要介紹了mybatis plus自動(dòng)生成代碼tinyint(1)自動(dòng)轉(zhuǎn)換為Boolean的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • SpringBoot中忽略實(shí)體類(lèi)中的某個(gè)屬性不返回給前端的方法(示例詳解)

    SpringBoot中忽略實(shí)體類(lèi)中的某個(gè)屬性不返回給前端的方法(示例詳解)

    本文介紹了在Spring Boot中使用Jackson和Fastjson忽略實(shí)體類(lèi)屬性不返回給前端的方法,在Jackson中,同時(shí)使用@JsonProperty和@JsonIgnore時(shí),@JsonIgnore可能失效,Fastjson中可以使用@JSONField(serialize=false)來(lái)實(shí)現(xiàn),本文結(jié)合實(shí)例代碼介紹的非常詳細(xì),需要的朋友參考下吧
    2024-11-11
  • Java中Stream流Map分組方式詳細(xì)匯總

    Java中Stream流Map分組方式詳細(xì)匯總

    Stream將要處理的元素集合看作一種流,在流的過(guò)程中借助Stream?API對(duì)流中的元素進(jìn)行操作,比如篩選、排序、聚合等,下面這篇文章主要給大家介紹了關(guān)于Java中Stream流Map分組方式的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • 使用XSD校驗(yàn)Mybatis的SqlMapper配置文件的方法(1)

    使用XSD校驗(yàn)Mybatis的SqlMapper配置文件的方法(1)

    這篇文章以前面對(duì)SqlSessionFactoryBean的重構(gòu)為基礎(chǔ),簡(jiǎn)單的介紹了相關(guān)操作知識(shí),然后在給大家分享使用XSD校驗(yàn)Mybatis的SqlMapper配置文件的方法,感興趣的朋友參考下吧
    2016-11-11
  • 基于線程池的工作原理與源碼解讀

    基于線程池的工作原理與源碼解讀

    下面小編就為大家分享一篇基于線程池的工作原理與源碼解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • jsch中ChannelShell與ChannelExec的區(qū)別及說(shuō)明

    jsch中ChannelShell與ChannelExec的區(qū)別及說(shuō)明

    這篇文章主要介紹了jsch中ChannelShell與ChannelExec的區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • 如何讀取properties或yml文件數(shù)據(jù)并匹配

    如何讀取properties或yml文件數(shù)據(jù)并匹配

    這篇文章主要介紹了如何讀取properties或yml文件數(shù)據(jù)并匹配方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 一文搞懂hashCode()和equals()方法的原理

    一文搞懂hashCode()和equals()方法的原理

    這篇文章主要介紹了詳解hashCode()和equals()的本質(zhì)區(qū)別和聯(lián)系,本文先對(duì)兩種方法作了介紹,然后對(duì)二者聯(lián)系進(jìn)行分析,具有一定參考價(jià)值,需要的朋友可以了解下
    2020-06-06

最新評(píng)論

敦煌市| 岐山县| 酉阳| 汶上县| 濮阳县| 陆河县| 安塞县| 陈巴尔虎旗| 若羌县| 林芝县| 榕江县| 滦平县| 镇康县| 随州市| 兴安盟| 元阳县| 哈尔滨市| 新化县| 北宁市| 康马县| 孝感市| 邢台市| 都安| 铜鼓县| 温州市| 江西省| 金乡县| 宿松县| 江孜县| 鸡东县| 腾冲县| 策勒县| 长垣县| 弥勒县| 沧源| 北海市| 凤翔县| 博野县| 浦东新区| 榕江县| 贵阳市|