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

SpringEvents與異步事件驅(qū)動案例詳解

 更新時間:2024年09月23日 08:51:50   作者:五官一體即忢  
本文深入探討了SpringBoot中的事件驅(qū)動架構(gòu),特別是通過Spring事件機制實現(xiàn)組件解耦和系統(tǒng)擴展性增強,介紹了事件的發(fā)布者、事件本身、事件監(jiān)聽器和事件處理器的概念,感興趣的朋友跟隨小編一起看看吧

引言

在開發(fā)基于Spring Boot的應(yīng)用程序時,事件驅(qū)動架構(gòu)是一個非常重要的概念。通過使用Spring框架提供的事件機制,我們可以輕松地解耦組件并提高系統(tǒng)的可擴展性。本文將深入探討Spring事件(SpringEvent)的實現(xiàn),并通過一個實際的業(yè)務(wù)場景來展示如何使用它。

1. Spring Event機制簡介

Spring事件機制主要由以下幾個部分組成:

  • 事件發(fā)布者 (ApplicationEventPublisher): 發(fā)布事件的對象。

  • 事件 (ApplicationEvent): 事件的具體內(nèi)容。

  • 事件監(jiān)聽器 (ApplicationListener): 處理事件的對象。

  • 事件處理器 (ApplicationEventMulticaster): 負(fù)責(zé)將事件發(fā)送給所有注冊的監(jiān)聽器。

2. 實際業(yè)務(wù)案例 - 訂單創(chuàng)建通知

假設(shè)我們正在構(gòu)建一個簡單的電子商務(wù)平臺,當(dāng)用戶成功創(chuàng)建訂單后,我們需要通知其他系統(tǒng)(如庫存系統(tǒng)和支付系統(tǒng))進行相應(yīng)的處理。

3. 技術(shù)棧

  • Spring Boot 3.x

  • Java 17

4. 創(chuàng)建項目

首先,我們需要創(chuàng)建一個新的Spring Boot項目。這里我們使用Spring Initializr來快速生成項目骨架。

5. 定義事件

為了定義我們的事件,我們需要創(chuàng)建一個繼承自ApplicationEvent的新類。

import org.springframework.context.ApplicationEvent;
3public class OrderCreatedEvent extends ApplicationEvent {
    private final String orderId;
    private final String userId;
    public OrderCreatedEvent(Object source, String orderId, String userId) {
        super(source);
        this.orderId = orderId;
        this.userId = userId;
    }
    public String getOrderId() {
        return orderId;
    }
    public String getUserId() {
        return userId;
    }
}

6. 創(chuàng)建事件監(jiān)聽器

接下來,我們需要創(chuàng)建監(jiān)聽器來處理事件。為了確保多個處理器能夠獨立運行,我們將使用@Async注解來確保每個監(jiān)聽器都能夠在自己的線程中獨立運行。

import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
@Component
public class OrderEventListener {
    @Async
    @EventListener
    public void handleOrderCreated(OrderCreatedEvent event) {
        System.out.println("Received order created event: " + event.getOrderId());
        // 這里可以調(diào)用其他服務(wù),比如通知庫存系統(tǒng)或支付系統(tǒng)
        try {
            Thread.sleep(2000); // 模擬耗時操作
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            throw new RuntimeException(e);
        }
    }
}

為了展示多處理器的情況,我們可以添加另一個監(jiān)聽器,它會執(zhí)行不同的任務(wù)。

import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
@Component
public class PaymentEventListener {
    @Async
    @EventListener
    public void handleOrderCreated(OrderCreatedEvent event) {
        System.out.println("Payment processing for order: " + event.getOrderId());
        // 這里可以調(diào)用支付服務(wù)
        try {
            Thread.sleep(3000); // 模擬耗時操作
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            throw new RuntimeException(e);
        }
    }
}

7. 添加異步支持

為了讓事件處理異步進行,我們需要添加Spring的異步支持。為此,我們需要創(chuàng)建一個配置類來啟用異步執(zhí)行,并指定一個線程池用于處理事件。

import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
6import java.util.concurrent.Executor;
@Configuration
public class AsyncConfig implements AsyncConfigurer {
    @Override
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(2);
        executor.setMaxPoolSize(2);
        executor.setQueueCapacity(500);
        executor.setThreadNamePrefix("AsyncExecutor-");
        executor.initialize();
        return executor;
    }
    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return (throwable, method, objects) -> throwable.printStackTrace();
    }
}

8. 發(fā)布事件

最后,我們需要在訂單服務(wù)中發(fā)布事件。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Service;
@Service
public class OrderService {
    private final ApplicationEventPublisher publisher;
    @Autowired
    public OrderService(ApplicationEventPublisher publisher) {
        this.publisher = publisher;
    }
    public void createOrder(String orderId, String userId) {
        // 創(chuàng)建訂單邏輯...
        // 發(fā)布事件
        publisher.publishEvent(new OrderCreatedEvent(this, orderId, userId));
    }
}

9. 測試

為了測試我們的實現(xiàn),可以在控制器中調(diào)用createOrder方法。

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class OrderController {
    private final OrderService orderService;
    @Autowired
    public OrderController(OrderService orderService) {
        this.orderService = orderService;
    }
    @GetMapping("/orders")
    public String createOrder() {
        orderService.createOrder("12345", "user123");
        return "Order created!";
    }
}

10. 總結(jié)

通過上述步驟,我們已經(jīng)成功地實現(xiàn)了基于Spring事件機制的通知功能。這不僅可以幫助我們構(gòu)建更加松散耦合的應(yīng)用程序,還能讓我們的代碼更易于擴展和維護。更重要的是,通過引入異步處理機制,我們確保了即使一個處理器出現(xiàn)異?;驁?zhí)行失敗,也不會影響到其他處理器的執(zhí)行。這是因為每個處理器都在獨立的線程中運行,并且異常會被
AsyncUncaughtExceptionHandler捕獲并記錄,而不會中斷其他處理器的執(zhí)行。

注意:在生產(chǎn)環(huán)境中,你需要根據(jù)實際情況調(diào)整線程池的大小和配置。此外,確保異常處理邏輯符合你的需求,例如記錄異常到日志系統(tǒng)或發(fā)送錯誤通知。

到此這篇關(guān)于SpringEvents與異步事件驅(qū)動的文章就介紹到這了,更多相關(guān)SpringEvents與異步事件驅(qū)動內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java集合框架線程同步代碼詳解

    java集合框架線程同步代碼詳解

    這篇文章主要介紹了java集合框架線程同步代碼詳解,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • java實現(xiàn)雪花算法ID生成器工具類

    java實現(xiàn)雪花算法ID生成器工具類

    本文主要介紹了java實現(xiàn)雪花算法ID生成器工具類,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • 詳解springboot采用多數(shù)據(jù)源對JdbcTemplate配置的方法

    詳解springboot采用多數(shù)據(jù)源對JdbcTemplate配置的方法

    在本篇文章中我們給大家詳細(xì)分享了springboot采用多數(shù)據(jù)源對JdbcTemplate配置的方法,有需要的朋友們可以學(xué)習(xí)參考下。
    2018-10-10
  • Hadoop源碼分析四遠(yuǎn)程debug調(diào)試

    Hadoop源碼分析四遠(yuǎn)程debug調(diào)試

    本篇是Hadoop源碼分析系列文章第四篇,主要介紹一下Hadoop的遠(yuǎn)程debug調(diào)試步驟,后續(xù)本系列文章會持續(xù)更新,有需要的朋友可以借鑒參考下
    2021-09-09
  • 解決springboot mapper注入報紅問題

    解決springboot mapper注入報紅問題

    這篇文章主要介紹了解決springboot mapper注入報紅問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • mybatis攔截器注冊初始化編寫示例及如何生效詳解

    mybatis攔截器注冊初始化編寫示例及如何生效詳解

    這篇文章主要為大家介紹了mybatis攔截器注冊初始化編寫示例及如何生效詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • springboot 使用自定義的aspect的示例代碼

    springboot 使用自定義的aspect的示例代碼

    這篇文章主要介紹了springboot 使用自定義的aspect的示例代碼,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • 優(yōu)化MyBatis-Plus批量插入策略方式

    優(yōu)化MyBatis-Plus批量插入策略方式

    文章介紹了MyBatis-Plus的saveBatch方法雖然方便,但效率較低,提出了InsertBatchSomeColumn插件,可以在批量插入數(shù)據(jù)時只插入部分需要的列,從而提高效率,通過配置和代碼示例,展示了如何在項目中使用該插件進行批量插入操作
    2026-01-01
  • Java Map集合詳解與演示

    Java Map集合詳解與演示

    Map用于保存具有映射關(guān)系的數(shù)據(jù),Map集合里保存著兩組值,一組用于保存Map的ley,另一組保存著Map的value,可以理解為Map中的元素是兩個對象,一個對象作為鍵,一個對象作為值。鍵不可以重復(fù),但是值可以重復(fù)
    2021-11-11
  • idea中創(chuàng)建多module的maven工程的方法

    idea中創(chuàng)建多module的maven工程的方法

    這篇文章主要介紹了idea中創(chuàng)建多module的maven工程的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-10-10

最新評論

屏山县| 涡阳县| 庄河市| 上高县| 平顶山市| 遂溪县| 正阳县| 江山市| 嘉黎县| 合作市| 山丹县| 曲麻莱县| 无极县| 洪洞县| 崇左市| 永定县| 鄂伦春自治旗| 孟村| 马边| 新源县| 婺源县| 汝南县| 揭东县| 襄汾县| 沙洋县| 肥城市| 高邮市| 酉阳| 蒙城县| 嘉黎县| 南和县| 阿勒泰市| 达孜县| 涿鹿县| 肥西县| 松溪县| 涿州市| 建平县| 隆德县| 肥城市| 钟祥市|