【Takin 應用日記】記一次 TransmittableThreadLocal 引起的業務異常
對於常見的WEB容器,Takin透過增強org.apache.catalina.core.StandardHostValve#invoke方法,攔截並解析方法入參的Request物件中的header資料,判斷壓測標的資訊並將壓測標以及鏈路資訊設定到上下文物件,並透過ThreadLocal儲存該上下文物件,以此來保證當前執行緒處理的過程中都能獲取到壓測標以及鏈路資訊。
但是不管是WEB容器還是業務程式碼經常會使用執行緒池執行程式碼,這時候ThreadLocal就有侷限性了,如何做到跨執行緒池傳遞我們的上下文物件就顯得異常重要了,好在Alibaba的 解決了這個問題,具體transmittable-thread-local的詳細內容大家可以透過git地址檢視,這裡我們主要以git上的demo看看transmittable-thread-local如何實現跨執行緒傳遞的,主要透過將執行緒池執行的Runnable物件包裝成TtlRunnable物件並儲存當前的上下文資訊。這樣就完成了對執行緒池執行任務的壓測標以及鏈路資料資訊的透傳,至此似乎一切都很完美。
直到某次出現了一個詭異的現象,在使用Takin的過程中,有一應用接入Takin之後,某個功能無法正常使用,但是無論是應用的日誌還是Takin的日誌都未顯示任何異常資訊,再追問了無法使用的功能是一個執行緒池執行任務,當時擴充套件了ThreadPoolExecutor的beforeExecute方法和afterExecute方法,用以記錄任務執行的耗時,並且會列印任務的taskId等資訊,透過截圖的Debug資訊便可以看到問題出現了,由於使用了transmittable-thread-local導致原始的Runnable被包裝成了TtlRunnable物件,在這個過程中如果業務想要再獲取Runnable物件強轉獲取一些任務資訊,就會出現類無法轉換的異常。
解決方案的話目前可以透過增強beforeExecute和afterExecute方法,對Runnable物件進行判斷,如果是TtlRunnable物件,則透過TtlRunnable.getRunnable()方法返回原是的Runnable物件
Takin開源詳情
立即掃碼,入群技術交流~
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70004063/viewspace-2786768/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Flutter | 記一次Mixin Analysis異常Flutter
- 一次django記憶體異常排查Django記憶體
- 一個由程式記憶體佈局異常引起的問題記憶體
- 線上ES叢集引數配置引起的業務異常案例分析
- 記一次棧溢位異常問題的排查
- 一次排查線上介面偶發異常耗時引起的思考!
- 應用補丁升級引起的Goldengate的replicate程式異常終止Go
- 踩坑記:gRPC 異常響應RPC
- Layui引起的對前端的一次記錄UI前端
- 記一次伺服器被用來挖礦的異常問題處理伺服器
- Java 筆記《異常》Java筆記
- 記錄一次Flink作業異常的排查過程
- 一次異常記憶體消耗的診斷與解決記憶體
- Java核心技術筆記 異常、斷言和日誌Java筆記
- 記一次go中map併發引起的事故Go
- 記錄一次因subprocess PIPE 引起的線上故障
- 記一次資料庫索引引起的當機。。。資料庫索引
- 記錄一次Springboot Data Jdbc的autoWorkController異常Spring BootJDBCController
- 記一次故障排查(vnc日誌檔案過大導致crsd程式異常終止)VNC
- CoreDNS解析異常記錄DNS
- C++筆記--異常C++筆記
- 監控某程式記憶體佔用異常記憶體
- 在日誌中記錄Java異常資訊的正確姿勢Java
- 一次線上JVM記憶體異常排查 -- 物件之間的複製JVM記憶體物件
- 記一次 Java 應用記憶體洩漏的定位過程Java記憶體
- 記一次尷尬的Java應用記憶體洩露排查Java記憶體洩露
- Day One for Mac免費的日記應用Mac
- java異常處理筆記Java筆記
- 記錄Javascript 異常捕獲JavaScript
- java學習筆記(異常)Java筆記
- 【筆記】forall 異常捕獲筆記
- 記Linux使用異常2Linux
- 記一次 .NET 某教育系統API 異常崩潰分析API
- 記一次FreeBSD系統中mysql服務異常的排查過程MySql
- AOP記錄異常郵件傳送記錄
- 記一次開發中的靈異事件事件
- 記一次詭異的故障排查經歷
- VIEW和SYNONYM引起的執行計劃的異常View