日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

使用ARMS監控異步任務

若您的異步任務出現接口超時等異常,可以通過調用鏈路查看異步任務上下游以便及時處理潛在問題。ARMS默認自動監控使用Spring @Async標簽實現的異步任務。如果您需要監控自定義異步任務,可以通過添加異步透傳掃描包和使用ARMS SDK進行手動透傳實現。

前提條件

該功能要求ARMS探針版本為v2.7.1.3或以上。升級探針的操作,請參見升級ARMS探針

監控Spring @Async標簽實現的異步任務

ARMS默認自動監控使用Spring @Async標簽實現的異步任務。對于下列Spring框架中默認的ExecutorTask,ARMS會自動完成增強:

  • Executor:

    • org.springframework.scheduling.concurrent.ConcurrentTaskExecutor

    • org.springframework.core.task.SimpleAsyncTaskExecutor

    • org.springframework.scheduling.quartz.SimpleThreadPoolTaskExecutor

    • org.springframework.core.task.support.TaskExecutorAdapter

    • org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor

    • org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler

    • org.springframework.jca.work.WorkManagerTaskExecutor

    • org.springframework.scheduling.commonj.WorkManagerTaskExecutor

  • Task:

    • org.springframework.aop.interceptor.AsyncExecutionInterceptor$1

    • org.springframework.aop.interceptor.AsyncExecutionInterceptor$$Lambda$

監控自定義異步任務

添加異步透傳掃描包

您可以選擇在應用設置中添加異步透傳掃描包實現異步任務監控。異步透傳掃描包中的Runnable、CallableSupplier接口在創建新對象時會自動捕獲當前線程調用鏈的上下文,并在異步線程中執行時使用該調用鏈上下文,完成串聯。

  1. 登錄ARMS控制臺,在左側導航欄選擇應用監控 > 應用列表。

  2. 應用列表頁面頂部選擇目標地域,然后單擊目標應用名稱。

    說明

    語言列顯示Java圖標圖標的應用為接入應用監控的應用,顯示-圖標的應用為接入可觀測鏈路 OpenTelemetry 版的應用。

  3. 在左側導航欄,單擊應用設置,然后單擊自定義配置頁簽。

  4. 高級設置區域的異步透傳掃描包名對話框中,添加異步透傳掃描包。

    異步透傳掃描包

  5. 在頁面底部,單擊保存

重要

配置后需重啟應用才能使功能生效。如需添加多個異步透傳掃描包,可以使用英文半角逗號(,)分隔。

例如,對于通過以下示例代碼創建的異步任務,您可以使用添加異步透傳掃描包的方式對此異步任務進行監控。此示例代碼中,異步透傳包名為com.alibaba.arms.brightroar.console.service。

重要
  • 在配置時,您可以按需調整異步透傳包名的范圍。若需監控的異步任務過多,您可以縮小異步透傳包名的范圍。在本示例中,除了輸入完整的異步透傳包名com.alibaba.arms.brightroar.console.service以外,您還可以輸入更短的前綴包名com.alibaba.arms來自動掃描此目錄下的所有子透傳包。但需注意的是,若前綴包名范圍過大,會對性能產生影響,請謹慎操作。

  • 線程池在通過submit等方法提交Runnable對象時,如果您提交的Runnable對象是lambda表達式形式,可能會出現重復的TraceID,推薦您使用下面新建匿名對象的方法來使用本功能。4.0及以上版本的探針提交lambda表達式形式的Runnable對象不會出現此問題。

package com.alibaba.arms.brightroar.console.service;

@Service
public class NameService {

    private ExecutorService es = Executors.newFixedThreadPool(5);

    public void name() {
        es.submit(new Runnable() {
            @Override
            public void run() {
                System.out.println(System.currentTimeMillis()+ ": my name is john, " + Thread.currentThread().getId());
            }
        });
    }
}

使用ARMS SDK手動透傳

當您的使用方式比較復雜,上述場景無法滿足需求時,您還可以選擇使用ARMS SDK進行手動透傳。通過手動增強Runnable接口、Callable接口和Executor,在異步線程中完成調用鏈串聯,實現異步任務監控。

  1. Maven項目的pom.xml中添加以下依賴。

    <dependency>
     <groupId>com.alibaba.arms.apm</groupId>
     <version>1.7.5</version>
     <artifactId>arms-sdk</artifactId>
    </dependency>
  2. 增強Runnable接口、Callable接口和Executor。您可以按需選擇以下任意一種增強方式。

    方式一:增強Runnable接口和Callable接口

    使用TraceRunnable.asyncEntry()增強Runnable接口,使用TraceCallable.asyncEntry()增強Callable接口。示例代碼如下:

    public class AsyncEntryExample {
    
        private final ExecutorService executor = Executors.newSingleThreadExecutor();
    
        @GetMapping(value = "/sdk-async-plugin/asyncEntry-propagation")
        public String asyncEntryAndExecute() throws Exception {
            CompletableFuture<String> future = new CompletableFuture<>();
            Runnable command = TraceRunnable.asyncEntry(() -> future.complete("asyncEntry-execute"));
            executor.execute(command);
            Thread.sleep(1000);
            return future.get();
        }
    }

    方式二:增強Executor

    使用TraceExecutors.wrapExecutorService(executor, true)增強Executor。示例代碼如下:

    public class AutoExample {
    
        private final ExecutorService contextPropagationExecutor
                = TraceExecutors.wrapExecutorService(Executors.newSingleThreadExecutor(), true);
    
        @GetMapping(value = "/sdk-async-plugin/auto-context-propagation")
        public String autoWrapAndExecute() throws Exception {
            CompletableFuture<String> future = new CompletableFuture<>();
            contextPropagationExecutor.execute(() -> future.complete("auto-execute"));
            Thread.sleep(1000);
            return future.get();
        }
    }

    方式三:同時增強Runnable接口、Callable接口和Executor

    示例代碼如下:

    public class ManualExample {
        private final ExecutorService traceExecutor
                = TraceExecutors.wrapExecutorService(Executors.newSingleThreadExecutor());
    
        @GetMapping(value = "/sdk-async-plugin/manual-context-propagation")
        public String manualWrapAndExecute() throws Exception {
            CompletableFuture<String> future = new CompletableFuture<>();
            traceExecutor.execute(TraceRunnable.wrap(() -> future.complete("manual-execute")));
            traceExecutor.execute(() -> "Not captured");
            Thread.sleep(1000);
            return future.get();
        }
    }

執行結果

配置完成后,您可以在調用鏈路詳情頁查看異步任務的調用鏈詳情。具體詳情,請參見調用鏈路查詢。

異步調用詳情