国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

SpringBoot異步方法支持注解@Async應(yīng)用

這篇具有很好參考價(jià)值的文章主要介紹了SpringBoot異步方法支持注解@Async應(yīng)用。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

SpringBoot異步方法支持注解@Async應(yīng)用,SpringBoot,spring boot,后端,java

SpringBoot異步方法支持注解@Async應(yīng)用

1.為什么需要異步方法?

合理使用異步方法可以有效的提高執(zhí)行效率

同步執(zhí)行(同在一個(gè)線程中):SpringBoot異步方法支持注解@Async應(yīng)用,SpringBoot,spring boot,后端,java

異步執(zhí)行(開啟額外線程來執(zhí)行):
SpringBoot異步方法支持注解@Async應(yīng)用,SpringBoot,spring boot,后端,java

2.SpringBoot中的異步方法支持

在SpringBoot中并不需要我們自己去創(chuàng)建維護(hù)線程或者線程池來異步的執(zhí)行方法, SpringBoot已經(jīng)提供了異步方法支持注解.

@EnableAsync // 使用異步方法時(shí)需要提前開啟(在啟動(dòng)類上或配置類上)
@Async // 被async注解修飾的方法由SpringBoot默認(rèn)線程池(SimpleAsyncTaskExecutor)執(zhí)行

service層:

@Service
public class ArticleServiceImpl {

    // 查詢文章
    public String selectArticle() {
        //  模擬文章查詢操作
        System.out.println("查詢?nèi)蝿?wù)線程"+Thread.currentThread().getName());
        return "文章詳情";
    }

    // 文章閱讀量+1
    @Async
    public void updateReadCount() {
        try {
            // 模擬耗時(shí)操作
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("更新任務(wù)線程"+Thread.currentThread().getName());
    }
}

controller層:

@RestController
public class AsyncTestController {

    @Autowired
    private ArticleServiceImpl articleService;

    /**
     * 模擬獲取文章后閱讀量+1
     */
    @GetMapping("/article")
    public String getArticle() {
        long start = System.currentTimeMillis();
        // 查詢文章
        String article = articleService.selectArticle();
        // 閱讀量+1
        articleService.updateReadCount();
        long end = System.currentTimeMillis();
        System.out.println("文章閱讀業(yè)務(wù)執(zhí)行完畢,執(zhí)行共計(jì)耗時(shí):"+(end-start));
        return article;
    }

}

測(cè)試結(jié)果: 我們可以感受到接口響應(yīng)速度大大提升, 而且從日志中key看到兩個(gè)執(zhí)行任務(wù)是在不同的線程中執(zhí)行的

查詢?nèi)蝿?wù)線程http-nio-8800-exec-3
文章閱讀業(yè)務(wù)執(zhí)行完畢,執(zhí)行共計(jì)耗時(shí):56
更新任務(wù)線程task-1

3.自定義線程池執(zhí)行異步方法

SpringBoot為我們默認(rèn)提供了線程池(SimpleAsyncTaskExecutor)來執(zhí)行我們的異步方法, 我們也可以自定義自己的線程池.

第一步配置自定義線程池

@EnableAsync // 開啟多線程, 項(xiàng)目啟動(dòng)時(shí)自動(dòng)創(chuàng)建
@Configuration
public class AsyncConfig {
    @Bean("customExecutor")
    public ThreadPoolTaskExecutor asyncOperationExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        // 設(shè)置核心線程數(shù)
        executor.setCorePoolSize(8);
        // 設(shè)置最大線程數(shù)
        executor.setMaxPoolSize(20);
        // 設(shè)置隊(duì)列大小
        executor.setQueueCapacity(Integer.MAX_VALUE);
        // 設(shè)置線程活躍時(shí)間(秒)
        executor.setKeepAliveSeconds(60);
        // 設(shè)置線程名前綴+分組名稱
        executor.setThreadNamePrefix("AsyncOperationThread-");
        executor.setThreadGroupName("AsyncOperationGroup");
        // 所有任務(wù)結(jié)束后關(guān)閉線程池
        executor.setWaitForTasksToCompleteOnShutdown(true);
        // 初始化
        executor.initialize();
        return executor;
    }
}

第二步, 在@Async注解上指定執(zhí)行的線程池即可

// 文章閱讀量+1
@Async("customExecutor")
public void updateReadCount() {
    // TODO 模擬耗時(shí)操作
    try {
        Thread.sleep(3000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println("更新文章閱讀量線程"+Thread.currentThread().getName());
}

測(cè)試結(jié)果:

查詢?nèi)蝿?wù)線程http-nio-8800-exec-1
文章閱讀業(yè)務(wù)執(zhí)行完畢,執(zhí)行共計(jì)耗時(shí):17
更新任務(wù)線程AsyncOperationThread-1

4.如何捕獲(無返回值的)異步方法中的異常

以實(shí)現(xiàn)AsyncConfigurer接口的getAsyncExecutor方法和getAsyncUncaughtExceptionHandler方法改造配置類

自定義異常處理類CustomAsyncExceptionHandler

@EnableAsync // 開啟多線程, 項(xiàng)目啟動(dòng)時(shí)自動(dòng)創(chuàng)建
@Configuration
public class AsyncConfig implements AsyncConfigurer {
    @Override
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        // 設(shè)置核心線程數(shù)
        executor.setCorePoolSize(8);
        // 設(shè)置最大線程數(shù)
        executor.setMaxPoolSize(20);
        // 設(shè)置隊(duì)列大小
        executor.setQueueCapacity(Integer.MAX_VALUE);
        // 設(shè)置線程活躍時(shí)間(秒)
        executor.setKeepAliveSeconds(60);
        // 設(shè)置線程名前綴+分組名稱
        executor.setThreadNamePrefix("AsyncOperationThread-");
        executor.setThreadGroupName("AsyncOperationGroup");
        // 所有任務(wù)結(jié)束后關(guān)閉線程池
        executor.setWaitForTasksToCompleteOnShutdown(true);
        // 初始化
        executor.initialize();
        return executor;
    }

    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return new CustomAsyncExceptionHandler();
    }
}
public class CustomAsyncExceptionHandler implements AsyncUncaughtExceptionHandler {

    @Override
    public void handleUncaughtException(Throwable throwable, Method method, Object... obj) {
        System.out.println("異常捕獲---------------------------------");
        System.out.println("Exception message - " + throwable.getMessage());
        System.out.println("Method name - " + method.getName());
        for (Object param : obj) {
            System.out.println("Parameter value - " + param);
        }
        System.out.println("異常捕獲---------------------------------");
    }

}

測(cè)試結(jié)果:

查詢?nèi)蝿?wù)線程http-nio-8800-exec-1
文章閱讀業(yè)務(wù)執(zhí)行完畢,執(zhí)行共計(jì)耗時(shí):20
異常捕獲---------------------------------
Exception message - / by zero
Method name - updateReadCount
異常捕獲---------------------------------

5.如何獲取(有返回值)異步方法的返回值

使用Future類及其子類來接收異步方法返回值

注意:文章來源地址http://www.zghlxwxcb.cn/news/detail-680053.html

  • 無返回值的異步方法拋出異常不會(huì)影響Controller的主要業(yè)務(wù)邏輯
  • 有返回值的異步方法拋出異常會(huì)影響Controller的主要業(yè)務(wù)邏輯
// 異步方法---------------------------------------------------------------------
@Async
public CompletableFuture<Integer> updateReadCountHasResult() {
    try {
        // 模擬耗時(shí)操作
        Thread.sleep(3000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println("更新文章閱讀量線程"+Thread.currentThread().getName());
    return CompletableFuture.completedFuture(100 + 1);
}

// Controller調(diào)用---------------------------------------------------------------------
@GetMapping("/article")
public String getArticle() throws ExecutionException, InterruptedException {
    // 查詢文章
    String article = articleService.selectArticle();
    // 閱讀量+1
    CompletableFuture<Integer> future = articleService.updateReadCountHasResult();
    int count = 0;
    // 循環(huán)等待異步請(qǐng)求結(jié)果
    while (true) {
        if(future.isCancelled()) {
            System.out.println("異步任務(wù)取消");
            break;
        }
        if (future.isDone()) {
            count = future.get();
            System.out.println(count);
            break;
        }
    }
    System.out.println("文章閱讀業(yè)務(wù)執(zhí)行完畢");
    return article + count;
}

6.常見失效場(chǎng)景

  1. 主啟動(dòng)類或者配置類沒有添加@EnableAsync注解
  2. A方法調(diào)用被@Async注解修飾的B方法
@RestController
public class UserController {
 
    @Resource
    private UserService userService;
 
    @RequestMapping("/getAll")
    public void getUsers(){
        System.out.println("業(yè)務(wù)開始");
        test();
        System.out.println("業(yè)務(wù)結(jié)束");
    }
 
    @Async
    public void test(){
        try {
            Thread.sleep(2000);
            System.out.println(Thread.currentThread().getName()+"查詢到了所有的用戶信息!");
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
}
  1. 被@Async注解修飾的方法必須不可以是static和private,必須為public
  2. 需要通過@Autowired或@Resource進(jìn)行注入,不可手動(dòng)new,基于SpringAOP實(shí)現(xiàn)

到了這里,關(guān)于SpringBoot異步方法支持注解@Async應(yīng)用的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Spring6.x對(duì)調(diào)度和異步執(zhí)行的注解支持

    Spring為任務(wù)調(diào)度和異步方法執(zhí)行提供注解支持。 要啟用 @Scheduled 和 @Async ,在 @Configuration 類(或者在啟動(dòng)類)添加 @EnableScheduling 和 @EnableAsync ,如下: 你可以為你的應(yīng)用程序選擇相關(guān)的注解。例如,如果你只需要支持 @Scheduled ,可以省略 @EnableAsync 。對(duì)于更細(xì)粒度的控制,你還可

    2024年02月05日
    瀏覽(16)
  • java小技能:spring中的異步方法@Async失效的原因

    異步執(zhí)行的場(chǎng)景:不處理方法結(jié)果/在不關(guān)心方法執(zhí)行結(jié)果時(shí)經(jīng)常需要異步執(zhí)行 需求:自動(dòng)報(bào)名活動(dòng)、批量導(dǎo)入報(bào)名活動(dòng)

    2024年02月09日
    瀏覽(21)
  • 【SpringBoot】| Spring Boot 常見的底層注解剖析

    【SpringBoot】| Spring Boot 常見的底層注解剖析

    目錄 一:Spring Boot 常見的底層注解 1.?容器功能 1.1?組件添加 方法一:使用@Configuration注解+@Bean注解 方法二:使用@Configuration注解+@Import注解? 方法三:使用@Configuration注解+@Conditional注解? 1.2?原生xml配置文件引入 @ImportResource注解 1.3?配置綁定 方法一:@Component注解 + @Configu

    2024年02月17日
    瀏覽(28)
  • Spring Boot框架中Controller層API接口如何支持使用多個(gè)@RequestBody注解接受請(qǐng)求體參數(shù)

    Spring Boot框架中Controller層API接口如何支持使用多個(gè)@RequestBody注解接受請(qǐng)求體參數(shù)

    眾所周知,在Spring Boot框架中,Controller層API接口編碼獲取請(qǐng)求體參數(shù)時(shí),在參數(shù)上會(huì)使用@RequestBody注解;如果一次請(qǐng)求中,請(qǐng)求體參數(shù)攜帶的內(nèi)容需要用多個(gè)參數(shù)接收時(shí),能不能多次使用@RequestBody注解呢? 下面我們先測(cè)試一下,參考代碼: PostMan進(jìn)行請(qǐng)求: 服務(wù)端后端日志:

    2024年01月17日
    瀏覽(22)
  • @Async異步線程:Spring 自帶的異步解決方案

    @Async異步線程:Spring 自帶的異步解決方案

    ? ? ? ? 在項(xiàng)目應(yīng)用中,使用MQ異步調(diào)用來實(shí)現(xiàn)系統(tǒng)性能優(yōu)化,完成服務(wù)間數(shù)據(jù)同步是常用的技術(shù)手段。如果是在同一臺(tái)服務(wù)器內(nèi)部,不涉及到分布式系統(tǒng),單純的想實(shí)現(xiàn)部分業(yè)務(wù)的異步執(zhí)行,這里介紹一個(gè)更簡單的異步方法調(diào)用。 ????????對(duì)于異步方法調(diào)用,從Spring3 開

    2023年04月24日
    瀏覽(24)
  • SpringBoot--@Async異步

    SpringBoot--@Async異步

    包 注解 整體 異步類需要交給Spring管理 @Component 異步方法需要@Async修飾

    2024年02月11日
    瀏覽(19)
  • Spring之異步任務(wù)@Async詳解分析

    在 java 中異步線程很重要,比如在業(yè)務(wù)流處理時(shí),需要通知硬件設(shè)備,發(fā)短信通知用戶,或者需要上傳一些圖片資源到其他服務(wù)器這種耗時(shí)的操作,在主線程里處理會(huì)阻塞整理流程,而且我們也不需要等待處理結(jié)果之后再進(jìn)行下一步操作,這時(shí)候就可以使用異步線程進(jìn)行處理

    2024年02月01日
    瀏覽(37)
  • springboot @Async 異步調(diào)用接口處理數(shù)據(jù)

    springboot @Async 異步調(diào)用接口處理數(shù)據(jù)

    @Async 異步背景 新增的數(shù)據(jù)需要分發(fā)給下游業(yè)務(wù)系統(tǒng),由于下游業(yè)務(wù)系統(tǒng)狀態(tài)未知,所以需要異步發(fā)送數(shù)據(jù)給下游業(yè)務(wù)系統(tǒng)。 系統(tǒng)生效按鈕---controller新增--異步調(diào)用servcie---數(shù)據(jù)集成 在springboot框架中實(shí)現(xiàn)步驟 首先在啟動(dòng)類上加上 @EnableAsync 注解開啟項(xiàng)目的異步調(diào)用功能,其次

    2024年02月16日
    瀏覽(24)
  • java spring boot 注解、接口和問題解決方法(持續(xù)更新)

    java spring boot 注解、接口和問題解決方法(持續(xù)更新)

    @RestController ????????是SpringMVC框架中的一個(gè)注解,它結(jié)合了@Controller和@ResponseBody兩個(gè)注解的功能,用于標(biāo)記一個(gè)類或者方法,表示該類或方法用于處理HTTP請(qǐng)求,并將響應(yīng)的結(jié)果直接返回給客戶端,而不需要進(jìn)行視圖渲染 @Controller ????????是Spring Framework中的注解,用于

    2024年02月06日
    瀏覽(31)
  • 原來你是這樣的SpringBoot--Async異步任務(wù)

    原來你是這樣的SpringBoot--Async異步任務(wù)

    本節(jié)我們一起學(xué)習(xí)一下SpringBoot中的異步調(diào)用,主要用于優(yōu)化耗時(shí)較長的操作,提高系統(tǒng)性能和吞吐量。 首先給啟動(dòng)類增加注解@EnableAsync,支持異步調(diào)用 然后定義要執(zhí)行的Task,分類增加一個(gè)同步方法和異步方法,其中異步方法需要增加注解@Async 其實(shí)接下來就可以在controller中

    2024年02月11日
    瀏覽(17)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包