欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot實現異步事件驅動的方法

 更新時間:2021年06月28日 11:35:12   作者:飄渺Jam  
本文主要介紹了SpringBoot實現異步事件驅動的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

在項目實際開發(fā)過程中,我們有很多這樣的業(yè)務場景:一個事務中處理完一個業(yè)務邏輯后需要跟著處理另外一個業(yè)務邏輯,偽碼大致如下:

@Service
public class ProductServiceImpl {
 ...
    public void saveProduct(Product product) {
        productMapper.saveOrder(product);
        notifyService.notify(product);
    }
 ...
}

很簡單并且很常見的一段業(yè)務邏輯:首先將產品先保存數據庫,然后發(fā)送通知。

某一天你們可能需要把新增的產品存到Es中,這時候也需要代碼可能變成這樣:

@Service
public class ProductServiceImpl {
 ...
    public void saveProduct(Product product) {
        productMapper.saveProduct(product);
        esService.saveProduct(product)
        notifyService.notify(product);
    }
 ...
}

隨著業(yè)務需求的變化,代碼也需要跟著一遍遍的修改。而且還會存在另外一個問題,如果通知系統掛了,那就不能再新增產品了。

對于上面這種情況非常適合引入消息中間件(消息隊列)來對業(yè)務進行解耦,但并非所有的業(yè)務系統都會引入消息中間件(引入會第三方架構組件會帶來很大的運維成本)。

Spring提供了事件驅動機制可以幫助我們實現這一需求。

Spring事件驅動

spring事件驅動由3個部分組成

  • ApplicationEvent:表示事件本身,自定義事件需要繼承該類,用來定義事件
  • ApplicationEventPublisher:事件發(fā)送器,主要用來發(fā)布事件
  • ApplicationListener:事件監(jiān)聽器接口,監(jiān)聽類實現ApplicationListener 里onApplicationEvent方法即可,也可以在方法上增加@EventListener以實現事件監(jiān)聽。

實現Spring事件驅動一般只需要三步:

  • 自定義需要發(fā)布的事件類,需要繼承ApplicationEvent類
  • 使用ApplicationEventPublisher來發(fā)布自定義事件
  • 使用@EventListener來監(jiān)聽事件

這里需要特別注意一點,默認情況下事件是同步的。即事件被publish后會等待Listener的處理。如果發(fā)布事件處的業(yè)務存在事務,監(jiān)聽器處理也會在相同的事務中。如果需要異步處理事件,可以onApplicationEvent方法上加@Aync支持異步或在有@EventListener的注解方法上加上@Aync。

源碼實戰(zhàn)

創(chuàng)建事件

public class ProductEvent extends ApplicationEvent {
    public ProductEvent(Product product) {
        super(product);
    }
}

發(fā)布事件

@Service
public class ProductServiceImpl implements IproductService {
 ...
    @Autowired
    private ApplicationEventPublisher publisher;
 
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void saveProduct(Product product) {
  productMapper.saveProduct(product); 
        //事件發(fā)布
        publisher.publishEvent(product);
    }
    ...
}

事件監(jiān)聽

@Slf4j
@AllArgsConstructor
public class ProductListener {

 private final NotifyService notifyServcie;

 @Async
 @Order
 @EventListener(ProductEvent.class)
 public void notify(ProductEvent event) {
  Product product = (Product) event.getSource();
  notifyServcie.notify(product, "product");
 }
}

在SpringBoot啟動類上增加@EnableAsync 注解

@Slf4j
@EnableSwagger2
@SpringBootApplication
@EnableAsync
public class ApplicationBootstrap {
...
}

使用了Async后會使用默認的線程池SimpleAsyncTaskExecutor,一般我們會在項目中自定義一個線程池。

@Configuration
public class ExecutorConfig {
    /** 核心線程數 */
    private int corePoolSize = 10;
    /** 最大線程數  */
    private int maxPoolSize = 50;
    /** 隊列大小  */
    private int queueCapacity = 10;
    /** 線程最大空閑時間   */
    private int keepAliveSeconds = 150;

    @Bean("customExecutor")
    public Executor myExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(corePoolSize);
        executor.setMaxPoolSize(maxPoolSize);
        executor.setQueueCapacity(queueCapacity);
        executor.setThreadNamePrefix("customExecutor-");
        executor.setKeepAliveSeconds(keepAliveSeconds);

        // rejection-policy:當pool已經達到max size的時候,如何處理新任務
        // CALLER_RUNS:不在新線程中執(zhí)行任務,而是由調用者所在的線程來執(zhí)行
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        executor.initialize();
        return executor;
    }
}

到此這篇關于SpringBoot實現異步事件驅動的方法的文章就介紹到這了,更多相關SpringBoot 異步事件驅動內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 詳解Java如何實現一個BlockingQueue

    詳解Java如何實現一個BlockingQueue

    這篇文章主要為大家詳細介紹了Java如何實現一個BlockingQueue阻塞隊列,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-06-06
  • 在SpringBoot項目中實現讀寫分離的流程步驟

    在SpringBoot項目中實現讀寫分離的流程步驟

    SpringBoot作為一種快速開發(fā)框架,廣泛應用于Java項目中,在一些大型應用中,數據庫的讀寫分離是提升性能和擴展性的一種重要手段,本文將介紹如何在SpringBoot項目中優(yōu)雅地實現讀寫分離,并通過適當的代碼插入,詳細展開實現步驟,同時進行拓展和分析
    2023-11-11
  • java開源好用的簡繁轉換類庫推薦

    java開源好用的簡繁轉換類庫推薦

    這篇文章主要為大家介紹了java開源好用的簡繁轉換類庫推薦,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • 淺談spring-boot-rabbitmq動態(tài)管理的方法

    淺談spring-boot-rabbitmq動態(tài)管理的方法

    這篇文章主要介紹了淺談spring-boot-rabbitmq動態(tài)管理的方法,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • Spring學習筆記之RedisTemplate的配置與使用教程

    Spring學習筆記之RedisTemplate的配置與使用教程

    這篇文章主要給大家介紹了關于Spring學習筆記之RedisTemplate配置與使用的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用spring具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-06-06
  • 如何在Java中優(yōu)雅地使用正則表達式詳解

    如何在Java中優(yōu)雅地使用正則表達式詳解

    這篇文章主要給大家介紹了關于如何在Java中優(yōu)雅地使用正則表達式的相關資料,正則表達式就是一個字符串,但和普通的字符串不同的是,正則表達式是對一組相似字符串的抽象,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-02-02
  • Java深入探究關鍵字abstract的使用

    Java深入探究關鍵字abstract的使用

    如果一個方法使用 abstract 來修飾,則說明該方法是抽象方法,抽象方法只有聲明沒有實現。需要注意的是 abstract 關鍵字只能用于普通方法,不能用于 static 方法或者構造方法中
    2022-05-05
  • 虛擬機linux中jdk安裝配置方法

    虛擬機linux中jdk安裝配置方法

    這篇文章主要為大家詳細介紹了虛擬機linux中jdk安裝配置方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • Spring?boot?集成?MQTT詳情

    Spring?boot?集成?MQTT詳情

    這篇文章主要介紹了Spring?boot?集成?MQTT詳情,MQTT是一種基于發(fā)布/訂閱模式的"輕量級"通訊協議,可以以極少的代碼和有限的帶寬為連接遠程設備提供實時可靠的消息服,下文更多相關介紹,需要的小伙伴可以參考一下
    2022-04-04
  • Java Lock接口實現原理及實例解析

    Java Lock接口實現原理及實例解析

    這篇文章主要介紹了Java Lock接口實現原理及實例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04

最新評論