多線程之HardCodedTarget(type=OssFileClient, name=file, url=http://file)異常

多線程之HardCodedTarget(type=OssFileClient, name=file, url=http://file)異常

摘要: 文檔描述了多線程環境下調用Feign客戶端OssFileClient時出現的HardCodedTarget異常。異常發生在異步保存文件到ES時,Feign調用未返回預期結果而直接打印了客戶端對象。問題分析指出可能原因:1)Feign調用失敗但未被捕獲;2)異步線程缺少Spring上下文導致認證失敗。解決方案包括:1)配置支持上下文傳播的線程池TaskDecorator;2)手動傳遞請求和Security上下文到異步線程。文中提供了ThreadPoolConfig配置類和ContextCopyingTaskDecorator實現,確保主線程上下文能正確傳遞到異步任務中。

前言
1,異常場景如下,文件上傳使用多線程調用微服務OssFile異步保存文件,日志報多線程之HardCodedTarget(type=OssFileClient, name=file, url=http://file)異常

原代碼如下

1,主業務代碼

    @Override@Transactional(rollbackFor = Exception.class)public Long inserTemergencyProcessingMessage(TemergencyProcessingDto dto) {// 1.獲取當前登錄人的信息// 2.緊急處理演練文檔保存...... // 5.異步添加索引到ESCompletableFuture.runAsync(() -> {log.info("緊急處理演練文檔開始異步:{} , {}",temergencyPlanEntity , flIds);temergencyProcessingEsService.indextemergencyProcessing(temergencyPlanEntity, flIds);}, threadCustomPoolExecutor);return planEntity.getId();}

保存ES的代碼如下

 @Overridepublic void indextemergencyProcessing(TemergencyPlanEntity planEntity, Set<Long> flIds) {try {// ... 業務代碼查詢文件信息 // 3.構建ES文檔TemergencyPlanEsDocument esDocument = buildEsDocument(planEntity, fileListEntities, fileContentsMap);// 4.索引到ES// 新增文檔 - 請求對象IndexRequest indexRequest = new IndexRequest("temergencn_plans").id(planEntity.getId().toString());// 添加文檔數據,數據轉換為Json...} catch (IOException e) {log.error("...的ES失敗,...的id是:{} ", planEntity.getId(), e);}}

2,錯誤日志如下

… … fiIds:[54]2025-08-26 18:52:52.905 [pool-2-thread-1] INFO com.xx.xxxefileapi.service.impl.TemergencyProcessingEsService - smartFileClient 獲取的數據是:HardCodedTarget(type=OssFileClient, name=file, url=http://file)
2025-08-26 18:52:52.910 [http-nio-16710-exec-3] INFO

3,問題排查思路

1,發現異步線程中調用了smartOssFileClient.queryFileListByIds(flIds),但是在日志中并沒有打印出調用該Feign客戶端后的結果(即沒有打印fileListEntitiesr 返回的數據是:),而是直接打印了ossFileClient對象,顯示為HardCodedTarget(type=OssFileClient, name=file, url=http://file)。

1.1 Feign客戶端調用失敗,但是沒有異常捕獲,但是查看代碼,在indextemergencyProcessing方法中捕獲的是IOException,而Feign調用可能拋出的是FeignException,屬于RuntimeException,所以沒有被捕獲,但奇怪的是也沒有看到異常日志。

1.2 線程上下文問題:Feign調用通常依賴于Spring的上下文(如請求攔截器、負載均衡等),而在異步線程中,可能無法獲取到正確的上下文,導致Feign調用失敗。
但是,從日志中看到,在異步線程中打印了ossFileClient對象,說明該對象不是null,而且Feign客戶端已經正常創建。

另外,注意到在異步線程打印日志的同時,主線程(http-nio-16710-exec-3)打印了AuthInterceptor的后置處理日志。這提示我們可能異步線程中缺少了某些上下文,例如安全上下文、請求頭等,導致Feign調用時沒有正確的認證信息。

解決方案:
1,確保Feign調用能夠傳遞必要的請求頭(如認證信息)。可以使用Feign的攔截器,或者自定義請求攔截器,在異步線程中手動設置請求頭。
2,檢查異步線程的線程池配置,是否支持上下文傳播。如果你使用的是Spring Boot 3.x,可以考慮使用Spring Boot的異步支持并配置任務裝飾器(TaskDecorator)來傳遞上下文。如果是較低版本,可以考慮使用其他方式(如InheritableThreadLocal)或者手動傳遞上下文。

4,手動傳遞上下文到異步線程

1,配置線程支持上下文傳遞

如果使用自定義線程池(threadCustomPoolExecutor),需確保其支持上下文傳播。推薦使用 TaskDecorator:


import lombok.Data;
import org.jetbrains.annotations.NotNull;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.task.TaskDecorator;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;/*** @author psd*/
@Data
@Configuration
public class ThreadPoolConfig {@Bean("threadCustomPoolExecutorAsync")public ThreadPoolTaskExecutor threadCustomPoolExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(coreSize);executor.setMaxPoolSize(maxSize);executor.setQueueCapacity(blockQueueSize);executor.setTaskDecorator(new ContextCopyingTaskDecorator());executor.setThreadNamePrefix("Async-Executor-");executor.initialize();return executor;}public static class ContextCopyingTaskDecorator implements TaskDecorator {@Overridepublic @NotNull Runnable decorate(@NotNull Runnable runnable) {// 捕獲主線程上下文RequestAttributes requestContext = RequestContextHolder.currentRequestAttributes();SecurityContext securityContext = SecurityContextHolder.getContext();return () -> {try {// 將主線程上下文設置到異步線程RequestContextHolder.setRequestAttributes(requestContext, true);SecurityContextHolder.setContext(securityContext);runnable.run();} finally {// 清理異步線程上下文RequestContextHolder.resetRequestAttributes();SecurityContextHolder.clearContext();}};}}
}
2,手動傳遞上下文到異步線程

@Resource
private ThreadPoolExecutor threadCustomPoolExecutor;@Override
@Transactional(rollbackFor = Exception.class)
public Long inserTemergencyProcessingMessage(ContingencyPlanDto dto) {// ... [原有代碼] ...// 捕獲當前請求上下文和安全上下文RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();SecurityContext securityContext = SecurityContextHolder.getContext();// 5.異步添加索引到ESCompletableFuture.runAsync(() -> {try {// 恢復上下文到異步線程RequestContextHolder.setRequestAttributes(requestAttributes);SecurityContextHolder.setContext(securityContext);log.info("應急預案開始異步:{} , {}", planEntity, flIds);temergencyProcessingEsService.indextemergencyProcessing(temergencyPlanEntity, flIds);} finally {// 清理上下文避免內存泄漏RequestContextHolder.resetRequestAttributes();SecurityContextHolder.clearContext();}}, threadCustomPoolExecutor);return planEntity.getId();
}

最終代碼調試到重點:
1,手動傳遞并恢復上下文(RequestContext + SecurityContext)
2,配置線程池的TaskDecorator確保上下文傳播。
3,確認Feign攔截器正確配置用于 token 傳遞。

喜歡我的文章記得點個在看,或者點贊,持續更新中ing…

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/95939.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/95939.shtml
英文地址,請注明出處:http://en.pswp.cn/web/95939.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

計算機視覺(十二):人工智能、機器學習與深度學習

人工智能 (AI)&#xff1a;宏大的目標 人工智能是最廣泛、最宏大的概念&#xff0c;它的目標是讓機器能夠模仿人類的智能行為&#xff0c;例如&#xff1a; 推理&#xff1a;像下棋程序一樣&#xff0c;通過邏輯來做決策。規劃&#xff1a;為實現一個目標而制定步驟&#xff0c…

容器元素的滾動條回到頂部

關閉再打開后&#xff0c;容器元素的滾動條回到頂部解決方法&#xff1a;1、通過打開開發者工具&#xff08;F12&#xff09;&#xff0c;找到滾動條所屬元素為 el-textarea__inner&#xff0c;其父類 class"el-textarea content"2、代碼&#xff0c;通過元素的方法 …

分布式專題——2 深入理解Redis線程模型

1 Redis 簡介 1.1 Redis 是什么&#xff1f; Redis 全稱 Remote Dictionary Server&#xff08;遠程字典服務&#xff09;&#xff0c;是一個開源的高性能 Key-Value 數據庫&#xff1b; 官網&#xff1a;Redis - The Real-time Data Platform&#xff1b; 引用官網上的?個…

simd學習

如何查看cpu是否支持simd&#xff1f;# 檢查特定指令集 grep -o avx2 /proc/cpuinfo | head -1 # 檢查AVX2 grep -o sse4 /proc/cpuinfo | head -1 # 檢查SSE4 grep -o avx512 /proc/cpuinfo | head -1 # 檢查AVX512gcc編譯選項&#xff0c;增加支持simd-mavx2 -D__AVX2__SS…

LabVIEW汽車發動機振動測試

以某型號四缸汽油發動機為測試對象&#xff0c;借助 LabVIEW 平臺與高精度數據采集硬件&#xff0c;開展發動機全工況振動測試。通過實時采集缸體、曲軸箱關鍵部位振動信號&#xff0c;分析振動特征與故障關聯&#xff0c;驗證發動機運行穩定性&#xff0c;為后期優化設計提供數…

android 四大組件—Service

啟動服務startService//啟動服務&#xff0c;通過類名 Intent intent new Intent(this, WiFiAutoLinkService.class); startService(intent); //通過字符串啟動 Intent intent new Intent(); intent.setAction("com.launcher.app"); intent.setPackage("com.l…

https + 域名 + 客戶端證書訪問模式

項目使用金融云部署&#xff0c;對外暴露IP訪問&#xff0c;因安全合規要求必須使用域名訪問&#xff0c;但公司又不提供域名。故&#xff0c;改為 https 域名 客戶端證書雙向認證 訪問模式&#xff0c;大大提升安全性。 1. 密鑰文件類型 .key、.csr、.cer&#xff08;或 .cr…

ICPC 2023 Nanjing R L 題 Elevator

[ProblemDiscription]\color{blue}{\texttt{[Problem Discription]}}[Problem Discription] 來源&#xff1a;洛谷。侵權則刪。 [Analysis]\color{blue}{\texttt{[Analysis]}}[Analysis] 貪心。優先運送樓層高的貨物&#xff0c;在能裝下的情況下盡量多裝。 因為運送貨物的代價…

81-dify案例分享-零代碼用 Dify 使用夢 AI 3.0 多模態模型,免費生成影視級視頻

1.前言 即夢AI作為字節跳動旗下的AI繪畫與視頻生成平臺&#xff0c;近年來不斷推出新的模型和功能&#xff0c;以提升用戶體驗和創作能力。 即夢AI 3.0是即夢AI的最新版本&#xff0c;于2025年4月發布&#xff0c;標志著其在中文生圖模型上的重大升級。該版本不僅在中文生圖能…

SQL 進階指南:視圖的創建與使用(視圖語法 / 作用 / 權限控制)

在 SQL 操作中&#xff0c;你是否遇到過 “頻繁查詢多表關聯的固定結果”“不想讓他人看到表中的敏感字段” 這類問題&#xff1f;比如 “每周都要查‘技術部員工的姓名、職位、薪資’”&#xff0c;每次都寫多表關聯語句很麻煩&#xff1b;又比如 “給實習生開放數據查詢權限&…

【全部更新完畢】2025數學建模國賽C題思路代碼文章高教社杯全國大學生數學建模-NIPT 的時點選擇與胎兒的異常判定

B題全部更新完畢 包含完整的文章全部問題的代碼、結果、圖表 完整內容請看文末最后的推廣群NIPT 的時點選擇與胎兒的異常判定 摘要 在問題一中&#xff0c;我們以無創產前檢測&#xff08;NIPT&#xff09;數據為研究對象&#xff0c;圍繞“胎兒 Y 染色體濃度”(記為 (V)) 隨孕…

Redis(43)Redis哨兵(Sentinel)是什么?

Redis Sentinel&#xff08;哨兵&#xff09;是一種用于管理 Redis 實例的高可用性解決方案。它提供了監控、通知和自動故障轉移等功能&#xff0c;確保 Redis 服務在發生故障時能夠自動恢復&#xff0c;提供高可用性和可靠性。以下是詳細介紹 Redis Sentinel 的功能及其代碼示…

蓓韻安禧DHA純植物藻油純凈安全零添加守護母嬰健康

在母嬰健康領域&#xff0c;選擇合適的營養補充品至關重要。純植物藻油DHA源自純凈藻類&#xff0c;有效規避了海洋重金屬污染的風險&#xff0c;確保安全無隱患。配方堅持零添加香精、色素和防腐劑&#xff0c;避免不必要的化學物質攝入&#xff0c;讓媽媽和寶寶更安心。同時&…

釘釘 AI 深度賦能制造業 LTC 全流程:以釘釘宜搭、Teambition 為例

制造業 LTC 流程痛點剖析?在制造業&#xff0c;線索到現金&#xff08;LTC&#xff0c;Lead to Cash&#xff09;的全流程包含從潛在客戶線索的發現、商機培育、銷售轉化、訂單執行到最終收款的一系列復雜環節。傳統制造業在這一流程中面臨諸多挑戰&#xff1a;客戶需求的多樣…

理解UE4中C++17的...符號及enable_if_t的用法及SFINAE思想

下面是一段C17的代碼&#xff1a;//函數1&#xff1a;template <typename... BufferTypes,std::enable_if_t<std::conjunction<CanAppendBufferType<std::decay_t<BufferTypes>>...>::value> * nullptr> inline explicit FCompositeBuffer(Buff…

安全419正式公布《甲方安全建設精品采購指南》案例首推運營商行業數據安全核心推薦廠商

在數字經濟加速滲透與《網絡數據安全管理條例》全面實施的雙重背景下&#xff0c;運營商作為數據要素流通的核心樞紐&#xff0c;其安全防護體系建設已成為數字基礎設施保障的關鍵環節。近日&#xff0c;安全 419 正式公布《甲方安全建設精品采購指南》&#xff0c;從近 300 個…

基礎詞根-匯總

ros rus粗糙 ris cos cus cis切lite文字 late面 側面ven 來 cess走/agdotect 覆蓋 covercele 聚集 加速 gre 聚集&#xff0c;accumu聚集gress 抵達 靠近&#xff0c;aggressive侵略性humor humir 大地 土地chron 時間 time&#xff0c;宇宙的宙lumi 光lightviv vil volun vot/…

JVM中常見的GC垃圾收集器

文章目錄 目錄 1. Serial GC&#xff08;串行收集器&#xff09; 2. Parallel GC&#xff08;并行收集器&#xff09; 3. CMS&#xff08;Concurrent Mark-Sweep&#xff0c;并發標記 - 清除&#xff09; 4. G1&#xff08;Garbage-First&#xff0c;垃圾優先&#xff09; …

嵌入式C語言之鏈表冒泡排序

鏈表冒泡排序一是可以交換指針域的值&#xff0c;二是可以交換指針typedef struct st_node{int score;struce st_node *next;}Node,*LinkList;LinkList createList(){Node *head (Node *)malloc(sizeof(Node));if(NULL head){printf("內存分配失敗!"):return NULL;…

遠場代碼學習_FDTD_farfield

項目4.2 farfield3d - Script command在3D模擬中將給定的功率或場剖面監視器或直線數據集投射到遠場。返回電場強度|E| 2。語法描述 out farfield3d("mname",f, na, nb, illumination, periodsa, periodsb, index, direction)&#xff1b; 將給定的功率或場分布監…