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

springboot中如何使用@Async方法

 更新時間:2024年08月05日 09:04:33   作者:sword to coding  
這篇文章主要介紹了springboot中如何使用@Async方法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

一.在啟動類上加上 啟動注解 @EnableAsync

二. 在需要進行異步處理的方法上加上注解@ Async

注意事項:

注解的方法 必須是public方法,因為該注解采用的是動態(tài)代理的方式

無論該方法的返回值是什么,被@Async注解的方法必定是Null

在方法內(nèi)不要遞歸調(diào)用,否則無效

三.自定義異步采用的線程池

當我們沒有自定義時,springboot是怎么樣采用默認配置的?

翻譯:當spring執(zhí)行這個方法時,默認會搜索關(guān)聯(lián)的線程池定義。

上下文中唯一的 Spring 框架 TaskExecutor bean 或名為“taskExecutor”的 Executor bean。

如果這兩個都不能解析,默認會使用spring框架SimpleAsyncTaskExecutor來處理異步方法的執(zhí)行。

使用上面的步驟,可以直接使用異步注解了,但是需要注意的是,異步所需的線程池采用的是springboot框架默認的線程池,我們有時候還需要自定義線程池來限制并發(fā)線程數(shù)和最大隊列。

怎么配置異步功能的異步線程池?

法一. 實現(xiàn)配置類 AsyncConfigurer

@Configuration
@EnableAsync
public class BaseAsyncConfigurer implements AsyncConfigurer {
 
    @Override
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        //核心線程池數(shù)量,方法: 返回可用處理器的Java虛擬機的數(shù)量。
        executor.setCorePoolSize(Runtime.getRuntime().availableProcessors());
        //最大線程數(shù)量
        executor.setMaxPoolSize(Runtime.getRuntime().availableProcessors()*5);
        //線程池的隊列容量
        executor.setQueueCapacity(Runtime.getRuntime().availableProcessors()*2);
        //線程名稱的前綴
        executor.setThreadNamePrefix("this-excutor-");
        // setRejectedExecutionHandler:當pool已經(jīng)達到max size的時候,如何處理新任務(wù)
        // CallerRunsPolicy:不在新線程中執(zhí)行任務(wù),而是由調(diào)用者所在的線程來執(zhí)行
        //executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        executor.initialize();
        return executor;
    }
    /*異步任務(wù)中異常處理*/
    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return (Throwable ex, Method method, Object... params)->{
            //todo 異步方法異常處理
            System.out.println("class#method: " + method.getDeclaringClass().getName() + "#" + method.getName());
            System.out.println("type        : " + ex.getClass().getName());
            System.out.println("exception   : " + ex.getMessage());
        };
    }
 
}

實現(xiàn)了這個接口過后,在使用@Async時就會自動使用我們自定義的線程池getAsyncExecutor了。

法二. 自定義一個線程池bean,在使用@Async注解時指定線程池

@Bean("threadPoolTaskExecutor")
    public TaskExecutor getAsyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(20);
        executor.setMaxPoolSize(1000);
        executor.setWaitForTasksToCompleteOnShutdown(true);
        executor.setThreadNamePrefix("Async-");
        return executor;
    }

使用注解@Async(“threadPoolTaskExecutor”) ,相當于在一個項目中,不同方法上面的@Async可以使用不同的線程池

總結(jié)

一般情況下,建議手動實現(xiàn)AsyncConfigurer來自定義線程池。

如果某些方法需要使用其他的線程池,就使用bean添加一個線程池,并在@Async的value值進行指定線程池。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringCloud配置中心Config過程解析

    SpringCloud配置中心Config過程解析

    這篇文章主要介紹了SpringCloud配置中心Config過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • Springboot2.6.x的啟動流程與自動配置詳解

    Springboot2.6.x的啟動流程與自動配置詳解

    這篇文章主要給大家介紹了關(guān)于Springboot2.6.x的啟動流程與自動配置的相關(guān)資料,文中通過實例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2022-01-01
  • sharding-jdbc中的事務(wù)詳細解讀

    sharding-jdbc中的事務(wù)詳細解讀

    這篇文章主要介紹了sharding-jdbc中的事務(wù)詳細解讀,sharding-jdbc在分庫分表方面提供了很大的便利性,在使用DB的時候,通常都會涉及到事務(wù)這個概念,而在分庫分表的環(huán)境上再加上事務(wù),就會使事情變得復(fù)雜起來,需要的朋友可以參考下
    2023-12-12
  • Spring activiti如何實現(xiàn)指定任務(wù)處理者

    Spring activiti如何實現(xiàn)指定任務(wù)處理者

    這篇文章主要介紹了Spring activiti如何實現(xiàn)指定任務(wù)處理者,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-11-11
  • java正則實現(xiàn)各種日期格式化

    java正則實現(xiàn)各種日期格式化

    本文給大家分享的是使用java結(jié)合正則表達式來實現(xiàn)各種日期的格式化功能,代碼非常的簡單,有需要的小伙伴可以參考下。
    2015-05-05
  • java web實現(xiàn)網(wǎng)上手機銷售系統(tǒng)

    java web實現(xiàn)網(wǎng)上手機銷售系統(tǒng)

    這篇文章主要為大家詳細介紹了java web實現(xiàn)網(wǎng)上手機銷售系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • JDK?version和class?file?version(Class編譯版本號)對應(yīng)關(guān)系解讀

    JDK?version和class?file?version(Class編譯版本號)對應(yīng)關(guān)系解讀

    這篇文章主要介紹了JDK?version和class?file?version(Class編譯版本號)對應(yīng)關(guān)系,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • 淺談java中String與StringBuffer的不同

    淺談java中String與StringBuffer的不同

    String在棧中,StringBuffer在堆中!所以String是不可變的,數(shù)據(jù)是共享的。StringBuffer都是獨占的,是可變的(因為每次都是創(chuàng)建新的對象!)
    2015-11-11
  • 深入分析Java內(nèi)存區(qū)域的使用詳解

    深入分析Java內(nèi)存區(qū)域的使用詳解

    本篇文章對Java內(nèi)存區(qū)域的使用進行了詳細的介紹。需要的朋友參考下
    2013-05-05
  • Java結(jié)構(gòu)型模式中的組合模式詳解

    Java結(jié)構(gòu)型模式中的組合模式詳解

    組合模式,又叫部分整體模式,它創(chuàng)建了對象組的數(shù)據(jù)結(jié)構(gòu)組合模式使得用戶對單個對象和組合對象的訪問具有一致性。本文將通過示例為大家詳細介紹一下組合模式,需要的可以參考一下
    2023-02-02

最新評論

闽清县| 江油市| 福安市| 炎陵县| 澳门| 乌兰察布市| 临夏市| 股票| 灵璧县| 武清区| 华阴市| 卢湾区| 汉寿县| 九江县| 青川县| 南华县| 南城县| 淮阳县| 乌兰县| 唐海县| 依兰县| 河池市| 二连浩特市| 建德市| 舞阳县| 肥西县| 惠州市| 长沙市| 温州市| 望奎县| 隆德县| 炎陵县| 棋牌| 迭部县| 遂宁市| 临海市| 北辰区| 临澧县| 鸡泽县| 舟山市| 镇坪县|