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

Spring?Boot中觸發(fā)異步任務(wù)的幾種實(shí)現(xiàn)方式總結(jié)

 更新時(shí)間:2025年04月27日 09:13:25   作者:流煙默  
這篇文章主要介紹了Spring?Boot中觸發(fā)異步任務(wù)的幾種實(shí)現(xiàn)方式,包括使用@Async注解、消息隊(duì)列、CompletableFuture和Spring?Events,每種方法都有其優(yōu)缺點(diǎn),文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下

在 Spring Boot 中觸發(fā)異步任務(wù)進(jìn)行心理健康評(píng)估,可通過(guò)以下方式實(shí)現(xiàn),各有優(yōu)缺點(diǎn):

1. 使用 @Async 注解

實(shí)現(xiàn)原理:基于 Spring 的異步支持,通過(guò)線程池執(zhí)行異步任務(wù)。

案例

// 配置類(lèi)啟用異步并自定義線程池
@Configuration
@EnableAsync
public class AsyncConfig {
    @Bean(name = "taskExecutor")
    public Executor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(5);
        executor.setMaxPoolSize(10);
        executor.setQueueCapacity(25);
        executor.setThreadNamePrefix("Async-");
        executor.initialize();
        return executor;
    }
}

// 服務(wù)類(lèi)
@Service
public class AssessmentService {
    @Async("taskExecutor")
    public void performMentalHealthAssessment(User user) {
        // 模擬耗時(shí)評(píng)估邏輯
        // ...
    }
}

// 控制器調(diào)用
@RestController
public class AssessmentController {
    @Autowired
    private AssessmentService assessmentService;

    @PostMapping("/trigger-assessment")
    public ResponseEntity<String> triggerAssessment(@RequestBody User user) {
        assessmentService.performMentalHealthAssessment(user);
        return ResponseEntity.ok("評(píng)估已異步觸發(fā)");
    }
}

優(yōu)點(diǎn)

  • 簡(jiǎn)單易用,只需添加注解和配置線程池。
  • 與 Spring 生態(tài)無(wú)縫集成。

缺點(diǎn)

  • 默認(rèn)使用 SimpleAsyncTaskExecutor(不重用線程),需手動(dòng)配置線程池優(yōu)化性能。
  • 異步方法需在 public 方法上調(diào)用,且同一類(lèi)內(nèi)部調(diào)用會(huì)失效(代理問(wèn)題)。
  • 異常處理需通過(guò) AsyncUncaughtExceptionHandler 自定義。

2. 消息隊(duì)列(如 RabbitMQ)

實(shí)現(xiàn)原理:通過(guò)消息中間件解耦,生產(chǎn)者發(fā)布任務(wù),消費(fèi)者異步處理。

案例

// 生產(chǎn)者(控制器)
@RestController
public class AssessmentController {
    @Autowired
    private RabbitTemplate rabbitTemplate;

    @PostMapping("/trigger-assessment")
    public ResponseEntity<String> triggerAssessment(@RequestBody User user) {
        rabbitTemplate.convertAndSend("assessmentExchange", "assessment.routingKey", user);
        return ResponseEntity.ok("評(píng)估任務(wù)已發(fā)送至消息隊(duì)列");
    }
}

// 消費(fèi)者
@Component
public class AssessmentConsumer {
    @RabbitListener(queues = "assessmentQueue")
    public void handleAssessment(User user) {
        // 處理心理健康評(píng)估
        // ...
    }
}

優(yōu)點(diǎn)

  • 完全解耦,適用于分布式系統(tǒng)。
  • 支持消息持久化、重試機(jī)制和流量削峰。

缺點(diǎn)

  • 需要額外維護(hù)消息中間件(如 RabbitMQ/Kafka)。
  • 增加了系統(tǒng)復(fù)雜度,需處理消息丟失、重復(fù)消費(fèi)等問(wèn)題。

3. CompletableFuture(手動(dòng)異步)

實(shí)現(xiàn)原理:利用 Java 8 的 CompletableFuture 手動(dòng)管理異步任務(wù)。

案例

@Service
public class AssessmentService {
    @Autowired
    private Executor taskExecutor;

    public CompletableFuture<Void> performMentalHealthAssessment(User user) {
        return CompletableFuture.runAsync(() -> {
            // 模擬耗時(shí)評(píng)估邏輯
            // ...
        }, taskExecutor);
    }
}

// 控制器調(diào)用
@PostMapping("/trigger-assessment")
public CompletableFuture<ResponseEntity<String>> triggerAssessment(@RequestBody User user) {
    return assessmentService.performMentalHealthAssessment(user)
            .thenApplyAsync(unused -> ResponseEntity.ok("評(píng)估完成"));
}

優(yōu)點(diǎn)

  • 靈活控制異步流程,支持鏈?zhǔn)秸{(diào)用和結(jié)果組合。
  • 可自定義線程池,避免資源競(jìng)爭(zhēng)。

缺點(diǎn)

  • 代碼復(fù)雜度較高,需手動(dòng)處理異常和超時(shí)。
  • 不適合簡(jiǎn)單的“觸發(fā)后不管”場(chǎng)景。

4. Spring Events(應(yīng)用內(nèi)事件)

實(shí)現(xiàn)原理:通過(guò)發(fā)布-訂閱模型實(shí)現(xiàn)異步事件監(jiān)聽(tīng)。

案例

// 定義事件
public class AssessmentEvent extends ApplicationEvent {
    private User user;
    public AssessmentEvent(Object source, User user) {
        super(source);
        this.user = user;
    }
    // getter
}

// 發(fā)布者(控制器)
@RestController
public class AssessmentController {
    @Autowired
    private ApplicationEventPublisher eventPublisher;

    @PostMapping("/trigger-assessment")
    public ResponseEntity<String> triggerAssessment(@RequestBody User user) {
        eventPublisher.publishEvent(new AssessmentEvent(this, user));
        return ResponseEntity.ok("評(píng)估事件已發(fā)布");
    }
}

// 異步監(jiān)聽(tīng)者
@Component
public class AssessmentListener {
    @Async
    @EventListener
    public void handleAssessmentEvent(AssessmentEvent event) {
        // 處理評(píng)估邏輯
        // ...
    }
}

優(yōu)點(diǎn)

  • 松耦合,便于擴(kuò)展多個(gè)監(jiān)聽(tīng)器。
  • 無(wú)需引入外部組件。

缺點(diǎn)

  • 僅適用于單應(yīng)用內(nèi),不支持分布式。
  • 默認(rèn)同步執(zhí)行,需配合 @Async 實(shí)現(xiàn)異步。

對(duì)比總結(jié)

方法適用場(chǎng)景優(yōu)點(diǎn)缺點(diǎn)
@Async簡(jiǎn)單異步任務(wù)集成簡(jiǎn)單,適合輕量級(jí)場(chǎng)景需處理線程池和異常,同類(lèi)調(diào)用失效
消息隊(duì)列分布式系統(tǒng)、高可靠性場(chǎng)景解耦徹底,支持重試和削峰維護(hù)中間件,復(fù)雜度高
CompletableFuture復(fù)雜異步流程控制靈活,支持鏈?zhǔn)秸{(diào)用代碼復(fù)雜,需手動(dòng)管理
Spring Events應(yīng)用內(nèi)事件通知松耦合,易于擴(kuò)展監(jiān)聽(tīng)器不支持分布式,依賴(lài) @Async

根據(jù)實(shí)際場(chǎng)景選擇:輕量級(jí)任務(wù)用 @Async,分布式需求用消息隊(duì)列,復(fù)雜流程用 CompletableFuture,應(yīng)用內(nèi)解耦用事件監(jiān)聽(tīng)。

到此這篇關(guān)于Spring Boot中觸發(fā)異步任務(wù)的幾種實(shí)現(xiàn)方式的文章就介紹到這了,更多相關(guān)SpringBoot觸發(fā)異步任務(wù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java多線程之 FutureTask:帶有返回值的函數(shù)定義和調(diào)用方式

    Java多線程之 FutureTask:帶有返回值的函數(shù)定義和調(diào)用方式

    這篇文章主要介紹了Java多線程之 FutureTask:帶有返回值的函數(shù)定義和調(diào)用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 將Arthas整合到Java業(yè)務(wù)鏡像中的流程步驟

    將Arthas整合到Java業(yè)務(wù)鏡像中的流程步驟

    在現(xiàn)代Java應(yīng)用開(kāi)發(fā)中,診斷和調(diào)試是一個(gè)不可或缺的環(huán)節(jié),Arthas,作為阿里巴巴開(kāi)源的一款Java診斷工具,提供了一種在不修改代碼的情況下,實(shí)時(shí)監(jiān)控、診斷和調(diào)試Java應(yīng)用程序的解決方案,本文將詳細(xì)介紹Arthas的基本概念,并逐步指導(dǎo)如何將其整合到Java業(yè)務(wù)鏡像中
    2025-02-02
  • Java 方法簽名詳解及實(shí)例代碼

    Java 方法簽名詳解及實(shí)例代碼

    這篇文章主要介紹了 Java 方法簽名詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • SpringBoot整合Mybatis與MybatisPlus方法詳細(xì)講解

    SpringBoot整合Mybatis與MybatisPlus方法詳細(xì)講解

    這篇文章主要介紹了SpringBoot整合Mybatis與MybatisPlus方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2023-01-01
  • Java使用正則表達(dá)式驗(yàn)證手機(jī)號(hào)和電話號(hào)碼的方法

    Java使用正則表達(dá)式驗(yàn)證手機(jī)號(hào)和電話號(hào)碼的方法

    今天小編就為大家分享一篇關(guān)于Java使用正則表達(dá)式驗(yàn)證手機(jī)號(hào)和電話號(hào)碼的方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12
  • Java中Validated、Valid 、Validator區(qū)別詳解

    Java中Validated、Valid 、Validator區(qū)別詳解

    本文主要介紹了Java中Validated、Valid 、Validator區(qū)別,有時(shí)候面試的時(shí)候會(huì)被問(wèn)到,他們的區(qū)別你知道幾個(gè),本文就來(lái)詳細(xì)的介紹一下
    2021-08-08
  • 詳談spring boot中幾種常見(jiàn)的依賴(lài)注入問(wèn)題

    詳談spring boot中幾種常見(jiàn)的依賴(lài)注入問(wèn)題

    這篇文章主要介紹了spring boot中幾種常見(jiàn)的依賴(lài)注入問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • springboot+vue實(shí)現(xiàn)登錄功能的最新方法整理

    springboot+vue實(shí)現(xiàn)登錄功能的最新方法整理

    最近做項(xiàng)目時(shí)使用到了springboot+vue實(shí)現(xiàn)登錄功能的技術(shù),所以下面這篇文章主要給大家介紹了關(guān)于springboot+vue實(shí)現(xiàn)登錄功能的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • springcloud如何使用Feign后臺(tái)內(nèi)部傳遞MultipartFile

    springcloud如何使用Feign后臺(tái)內(nèi)部傳遞MultipartFile

    這篇文章主要介紹了springcloud如何使用Feign后臺(tái)內(nèi)部傳遞MultipartFile,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • java基礎(chǔ)之方法詳解

    java基礎(chǔ)之方法詳解

    這篇文章主要介紹了java基礎(chǔ)之方法詳解,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04

最新評(píng)論