本文作者:suxingrui
本文連結:https://blog.csdn.net/suxingrui/article/details/80206058
版權聲明:本文為原創文章,轉載請注明出處。
跟蹤請求的整個處理鍊路過程,最友善的就是線上程名中添加traceId(跟蹤辨別符)或者streamNo(流水号),并列印線程名到日志。
如下圖
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNvwVZ2x2bzNXak9CX90TQNNkRrFlQKBTSvwFbslmZvwFMwQzLcVmepNHdu9mZvwFVywUNMZTY18CX052bm9CX90TUhFjSzoVdsdUZx40MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2LcRHelR3LcJzLctmch1mclRXY39zN2gjMwczM0ETNwUDM4EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
然而在使用Hystrix實作熔斷的時候發現,熔斷器使用自己的線程池,不易線上程名中展現出請求的整個處理鍊路過程。
為了實作這個目的,調查發現可以在FutureTask類的構造函數裡插入一行代碼。
public FutureTask(Runnable runnable, V result) {
// 在這插入一行代碼
// runnable = AgentHandler.prefixThreadName(runnable);
this.callable = Executors.callable(runnable, result);
this.state = NEW; // ensure visibility of callable
}
實作
FutureTaskTransformer
AgentHandler
PrefixThreadName
并在請求的AOP切面中添加
這樣就能夠到達目的。