使用APM監控異步任務
更新時間 2025-06-20 11:13:00
最近更新時間: 2025-06-20 11:13:00
分享文章
對于通過Spring @Async標簽或者Java Executors實現的異步任務,APM默認支持對其進行監控。若您的異步任務出現接口超時等異常,可以通過調用鏈路查看異步任務上下游以便及時處理潛在問題。
前置條件
該功能要求ARMS探針版本為公測版本v1.1.1及以上。
方式一:默認支持Spring @Async標簽
APM默認支持監控使用Spring @Async標簽實現的異步任務。對于下列Spring框架中默認的Executor和Task,APM會自動完成增強:
- 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.AsyncExecutionInterceptorLambda$
方式二:通過增強Runnable接口、Callable接口和Executor
當您沒有使用spring框架時,上述場景無法滿足需求時,也可以通過自動增強Runnable接口、Callable接口和Executor,在異步線程中完成調用鏈串聯,實現異步任務監控。
增強Runnable接口和Callable接口
public?class?MyRunnable?implements?Runnable?{
????@Override
????public?void?run()?{
????????//?在這里定義需要在新線程中執行的任務邏輯
????????for?(int?i?=?0;?i?<?5;?i++)?{
????????????System.out.println("Thread?ID:?"?+?Thread.currentThread().getId()?+?"?-?Count:?"?+?i);
????????}
????}
????public?static?void?main(String[]?args)?{
????????//?創建一個Runnable實例
????????Runnable?myRunnable?=?new?MyRunnable();
????????//?創建線程并將Runnable實例傳遞給線程
????????Thread?thread1?=?new?Thread(myRunnable);
????????Thread?thread2?=?new?Thread(myRunnable);
????????//?啟動線程
????????thread1.start();
????????thread2.start();
????}
}
增強Executor
import?java.util.concurrent.Executor;
import?java.util.concurrent.Executors;
public?class?ExecutorDemo?{
????public?static?void?main(String[]?args)?{
????????//?創建一個線程池,這里使用固定大小的線程池
????????Executor?executor?=?Executors.newFixedThreadPool(3);
????????//?提交任務給線程池執行
????????for?(int?i?=?0;?i?<?5;?i++)?{
????????????final?int?taskId?=?i;
????????????executor.execute(()?->?{
????????????????//?在這里定義需要執行的任務邏輯
????????????????System.out.println("Task?"?+?taskId?+?"?is?running?on?thread?"?+?Thread.currentThread().getName());
????????????});
????????}
????????//?關閉線程池(通常在應用程序退出時執行)
????????if?(executor?instanceof?java.util.concurrent.ExecutorService)?{
????????????((java.util.concurrent.ExecutorService)?executor).shutdown();
????????}
????}
}
執行結果
配置完成后,您可以在調用鏈路詳情頁查看異步任務的調用鏈詳情。