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

SpringBoot?異步線程間傳遞上下文方式

 更新時間:2021年11月20日 16:46:14   作者:ye17186  
這篇文章主要介紹了SpringBoot?異步線程間傳遞上下文方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

異步線程間傳遞上下文

需求

SpringBoot項目中,經常使用@Async來開啟一個子線程來完成異步操作。主線程中的用戶信息需要傳遞給子線程

實現(xiàn)

啟用異步功能

在啟動類里加上@EnableAsync注解

@EnableAsync
@SpringBootApplication
public class Application {}

配置異步

新建一個配置類,實現(xiàn)AsyncConfigurer接口,并重寫getAsyncExecutor方法

@Configuration
public class AsyncConfig implements AsyncConfigurer {
    @Override
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(10);
        executor.setMaxPoolSize(50);
        executor.setThreadNamePrefix("async-pool-");
        // 這一步是關鍵,異步Task裝飾器
        executor.setTaskDecorator(new MyContextDecorator());
        executor.initialize();
        return executor;
    }
}

配置任務裝飾器

新建一個異步任務裝飾器,實現(xiàn)TaskDecorator接口,并重寫decorate方法

public class MyContextDecorator implements TaskDecorator {
    @Override
    @Nonnull
    public Runnable decorate(@Nonnull Runnable runnable) {
  // 獲取主線程中的請求信息(我們的用戶信息也放在里面)
       RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
        return () -> {
            try {
               // 將主線程的請求信息,設置到子線程中
               RequestContextHolder.setRequestAttributes(attributes);
              // 執(zhí)行子線程,這一步不要忘了
                runnable.run();
            } finally {
             // 線程結束,清空這些信息,否則可能造成內存泄漏
                RequestContextHolder.resetRequestAttributes();
            }
        };
    }

補充下:RequestContextHolder內部是基于ThreadLocal實現(xiàn)的,因此在使用set get時,都是和當前線程綁定的。當然,使用者的用戶信息不一定放在了RequestContextHolder里面,讀者可以自行擴展。

到此,通過@Async開啟的子線程,就可以正常拿到父線程中的Request信息了。

啟用多線程安全上下文無法在線程間共享問題

問題

項目中多線程添加數據,mybatisplus元數據填充功能,填充創(chuàng)建人時,數據是來自 spring security SecurityContextHolder.getContext.getAuthentication,同步操作時,能正常獲取,而異步執(zhí)行時空指針異常。

解決方案

配置安全上下文全局策略SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_INHERITABLETHREADLOCAL)

原理

Spring Security 安全上下文默認策略為MODE_THREADLOCAL,ThreadLocal機制來保存每個使用者的安全上下文。

這意味著,只要針對某個使用者的邏輯執(zhí)行都是在同一個線程中進行,即使不在各個方法之間以參數的形式傳遞其安全上下文,各個方法也能通過SecurityContextHolder工具獲取到該安全上下文。

只要在處理完當前使用者的請求之后注意清除ThreadLocal中的安全上下文,這種使用ThreadLocal的方式是很安全的。

  • MODE_GLOBAL: JVM中所有的線程使用同一個安全上下文
  • MODE_INHERITABLETHREADLOCAL:有些應用會有自己的線程創(chuàng)建,并且希望這些新建線程也能使用創(chuàng)建者的安全上下文。這種效果,可以通過將SecurityContextHolder配置成MODE_INHERITABLETHREADLOCAL策略達到。

結果

在配置文件中添加:

@PostConstruct
public void init(){
    SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_INHERITABLETHREADLOCAL);
}
 

@PostConstruct注解好多人以為是Spring提供的。其實是Java自己的注解。

Java中該注解的說明:@PostConstruct該注解被用來修飾一個非靜態(tài)的void()方法。被@PostConstruct修飾的方法會在服務器加載Servlet的時候運行,并且只會被服務器執(zhí)行一次。PostConstruct在構造函數之后執(zhí)行,init()方法之前執(zhí)行。

通常我們會是在Spring框架中使用到@PostConstruct注解 該注解的方法在整個Bean初始化中的執(zhí)行順序:

Constructor(構造方法) -> @Autowired(依賴注入) -> @PostConstruct(注釋的方法)

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

相關文章

  • Java數組的聲明與創(chuàng)建示例詳解

    Java數組的聲明與創(chuàng)建示例詳解

    這篇文章主要介紹了Java數組的聲明與創(chuàng)建示例詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • Java 中Map 的用法詳解

    Java 中Map 的用法詳解

    本文主要介紹java 中的Map 接口, 這里對Map 接口下的幾個類做了詳細介紹,希望對學習java 編程的小伙伴有所幫助
    2016-07-07
  • 詳解java.lang.NumberFormatException錯誤及解決辦法

    詳解java.lang.NumberFormatException錯誤及解決辦法

    這篇文章主要介紹了詳解java.lang.NumberFormatException錯誤及解決辦法,本文詳解的介紹了錯誤的解決方法,感興趣的可以一起來了解一下
    2020-05-05
  • SpringBoot 中使用JSP的方法示例

    SpringBoot 中使用JSP的方法示例

    本篇文章主要介紹了SpringBoot 中使用JSP的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • Java 異常的棧軌跡(Stack Trace)詳解及實例代碼

    Java 異常的棧軌跡(Stack Trace)詳解及實例代碼

    這篇文章主要介紹了Java 異常的棧軌跡(Stack Trace)詳解及實例代碼的相關資料,需要的朋友可以參考下
    2017-03-03
  • SpringCloud降級規(guī)則使用介紹

    SpringCloud降級規(guī)則使用介紹

    這篇文章主要介紹了SpringCloud降級規(guī)則,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08
  • 全面總結java IO體系

    全面總結java IO體系

    這篇文章主要介紹了java IO體系的全面總結,下面和小編來一起學習一下吧
    2019-05-05
  • SpringBoot詳解如何進行整合Druid數據源

    SpringBoot詳解如何進行整合Druid數據源

    Druid是阿里開發(fā)的一款開源的數據源,被很多人認為是Java語言中最好的數據庫連接池,本文主要介紹了SpringBoot整合Druid數據源的方法實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-06-06
  • Java開啟新線程并傳參方法代碼實現(xiàn)

    Java開啟新線程并傳參方法代碼實現(xiàn)

    這篇文章主要介紹了Java開啟新線程并傳參方法代碼實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04
  • SpringMVC開發(fā)restful API之用戶查詢代碼詳解

    SpringMVC開發(fā)restful API之用戶查詢代碼詳解

    這篇文章主要介紹了SpringMVC開發(fā)restful API之用戶查詢代碼詳解,小編覺得挺不錯的,這里分享給大家,需要的朋友可以參考。下面隨小編一起看看吧。
    2017-11-11

最新評論

钟山县| 尼勒克县| 高淳县| 黑水县| 沛县| 汝州市| 淮北市| 山东省| 东宁县| 原阳县| 上思县| 柘城县| 财经| 马关县| 增城市| 拉萨市| 车险| 额敏县| 承德市| 靖宇县| 新宾| 榆林市| 辽中县| 宣威市| 固阳县| 吉水县| 云林县| 福海县| 土默特右旗| 海晏县| 荥阳市| 甘孜| 芦溪县| 富裕县| 高尔夫| 乌兰县| 子洲县| 井冈山市| 洞头县| 安陆市| 建水县|