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

SpringBoot+slf4j線程池全鏈路調(diào)用日志跟蹤問題及解決思路(二)

 更新時(shí)間:2021年05月13日 09:27:08   作者:kevin_ying  
本文主要給大家介紹如何實(shí)現(xiàn)子線程中的traceId日志跟蹤,本文通過封裝Callable為例給大家介紹的非常詳細(xì),需要的朋友一起看看吧

本項(xiàng)目源碼已在多個(gè)項(xiàng)目中實(shí)踐

接著上一篇文章,項(xiàng)目中使用了線程池,那么子線程中日志就會(huì)丟失traceId,下面講解如何實(shí)現(xiàn)子線程中的traceId日志跟蹤。

解決思路

子線程在打印日志的過程中traceId將丟失,解決方式為重寫線程池,將主線程的traceId繼續(xù)傳遞到子線程中。當(dāng)然,對(duì)于直接new創(chuàng)建線程的情況不考略【實(shí)際應(yīng)用中應(yīng)該避免這種用法】。

繼承ThreadPoolExecutor,重寫執(zhí)行任務(wù)的方法

public final class OverrideThreadPoolExecutor extends ThreadPoolExecutor {

    @Override
    public void execute(Runnable task) {
        super.execute(ThreadMdcUtil.wrap(task, MDC.getCopyOfContextMap()));
    }

    @Override
    public <T> Future<T> submit(Runnable task, T result) {
        return super.submit(ThreadMdcUtil.wrap(task, MDC.getCopyOfContextMap()), result);
    }

    @Override
    public <T> Future<T> submit(Callable<T> task) {
        return super.submit(ThreadMdcUtil.wrap(task, MDC.getCopyOfContextMap()));
    }

    @Override
    public Future<?> submit(Runnable task) {
        return super.submit(ThreadMdcUtil.wrap(task, MDC.getCopyOfContextMap()));
    }
}

封裝ThreadMdcUtil工具類

以封裝Callable為例:

  • 判斷當(dāng)前線程對(duì)應(yīng)MDC的Map是否存在,如果存在則設(shè)置子線程的ContextMap為當(dāng)前線程的;
  • 如果不存在,則重新生成traceId;
  • 執(zhí)行run方法
public final class ThreadMdcUtil {

    public static void setTraceIdIfAbsent() {
        if (MDC.get(TraceConstant.MDC_TRACE) == null || MDC.get(TraceConstant.MDC_TRACE).length() == 0) {
            String tid = UUID.randomUUID().toString().replace("-", "");
            MDC.put(TraceConstant.MDC_TRACE, tid);
        }
    }
   public static <T> Callable<T> wrap(final Callable<T> callable, final Map<String, String> context) {
        return () -> {
            if (context == null) {
                MDC.clear();
            } else {
                MDC.setContextMap(context);
            }
            setTraceIdIfAbsent();
            try {
                return callable.call();
            } finally {
                MDC.clear();
            }
        };
    }
}

測(cè)試子線程中traceId的傳遞,本項(xiàng)目中ExecutorService已經(jīng)重寫了線程池

@RestController
@RequestMapping("trace")
@Slf4j
@AllArgsConstructor
public class TestTraceController {

    private final ExecutorService executorService;

    @GetMapping("traceLog")
    public String traceLog() {
        log.info("---接口調(diào)用了---");
        traceService();
        asyncTrace();
        return "success";
    }

    private void traceService(){
        log.error("## 執(zhí)行traceService方法");
    }

    private void asyncTrace(){
        CompletableFuture.runAsync(()->{
            log.info("執(zhí)行線程池中的方法asyncTrace,未重寫了線程池");
        }, executorService);
    }

}

未重寫ThreadPoolExecutor效果如下:

重寫ThreadPoolExecutor效果如下:

到此這篇關(guān)于SpringBoot+slf4j線程池全鏈路調(diào)用日志跟蹤的文章就介紹到這了,更多相關(guān)SpringBoot全鏈路調(diào)用日志跟蹤內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot多controller添加URL前綴的實(shí)現(xiàn)方法

    SpringBoot多controller添加URL前綴的實(shí)現(xiàn)方法

    這篇文章主要介紹了SpringBoot多controller添加URL前綴的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-02-02
  • Java獲取項(xiàng)目路徑的多種方式

    Java獲取項(xiàng)目路徑的多種方式

    這篇文章主要介紹了Java獲取項(xiàng)目路徑的多種方式,這時(shí)候就需要用java給我們提供的一些獲取相對(duì)路徑方法了,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2022-01-01
  • 關(guān)于mybatis callSettersOnNulls 配置解析

    關(guān)于mybatis callSettersOnNulls 配置解析

    這篇文章主要介紹了關(guān)于mybatis callSettersOnNulls 配置,非常不錯(cuò),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下
    2018-06-06
  • springboot打jar包之后下載文件的路徑問題

    springboot打jar包之后下載文件的路徑問題

    這篇文章主要介紹了springboot打jar包之后下載文件的路徑問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Java服務(wù)如何調(diào)用系統(tǒng)指令、Bat腳本記錄

    Java服務(wù)如何調(diào)用系統(tǒng)指令、Bat腳本記錄

    這篇文章主要介紹了Java服務(wù)如何調(diào)用系統(tǒng)指令、Bat腳本記錄,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Java特性之注解和異常?Throwable

    Java特性之注解和異常?Throwable

    這篇文章主要介紹了Java特性之注解和異常,注解是JDK1.5版本開始引入的一個(gè)特性,Throwable是Java語言中所有錯(cuò)誤與異常的超類,文章圍繞主題展開更多的相關(guān)介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-06-06
  • sa-token?路由攔截式鑒權(quán)使用示例詳解

    sa-token?路由攔截式鑒權(quán)使用示例詳解

    這篇文章主要為大家介紹了sa-token?路由攔截式鑒權(quán)使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • Spring?Boot中application配置文件的生效順序及應(yīng)用范圍

    Spring?Boot中application配置文件的生效順序及應(yīng)用范圍

    Spring?Boot的一個(gè)重要特性就是它的自動(dòng)配置,這一特性在很大程度上依賴于名稱為application的配置文件,本文將詳細(xì)介紹在Spring?Boot中,這些配置文件的加載順序以及每份文件的應(yīng)用范圍,需要的朋友可以參考下
    2024-03-03
  • SpringBoot中的yaml語法及靜態(tài)資源訪問問題

    SpringBoot中的yaml語法及靜態(tài)資源訪問問題

    這篇文章主要介紹了SpringBoot中的yaml語法及靜態(tài)資源訪問問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-07-07
  • Java設(shè)計(jì)模式中的外觀模式詳解

    Java設(shè)計(jì)模式中的外觀模式詳解

    外觀模式為多個(gè)復(fù)雜的子系統(tǒng),提供了一個(gè)一致的界面,使得調(diào)用端只和這個(gè)接口發(fā)生調(diào)用,而無須關(guān)系這個(gè)子系統(tǒng)內(nèi)部的細(xì)節(jié)。本文將通過示例詳細(xì)為大家講解一下外觀模式,需要的可以參考一下
    2023-02-02

最新評(píng)論

五莲县| 镇坪县| 灌南县| 萍乡市| 泰宁县| 泰顺县| 崇左市| 杂多县| 贺兰县| 桃源县| 白水县| 萨嘎县| 辽宁省| 梨树县| 科技| 静安区| 金华市| 将乐县| 和静县| 渭源县| 漳州市| 威信县| 安徽省| 凉山| 武宁县| 易门县| 平乡县| 万安县| 洪湖市| 乌鲁木齐县| 孙吴县| 莱西市| 安福县| 安义县| 广东省| 桦南县| 海盐县| 团风县| 双辽市| 津南区| 石林|