需求

在skywalking的使用中,对于使用executorService中的多线程中的场景通常会失效,导致无法追中链路

解决方案

增加依赖

  <dependency>
     <groupId>org.apache.skywalking</groupId>
     <artifactId>apm-toolkit-trace</artifactId>
     <version>${skywalking.version}</version>
  </dependency>
代码依赖
  1. 使用1
 @TraceCrossThread
 public static class MyCallable<String> implements Callable<String> {
     @Override
     public String call() throws Exception {
         return null;
     }
 }
...
 ExecutorService executorService = Executors.newFixedThreadPool(1);
 executorService.submit(new MyCallable());
  1. 使用2
 ExecutorService executorService = Executors.newFixedThreadPool(1);
 executorService.submit(CallableWrapper.of(new Callable<String>() {
     @Override public String call() throws Exception {
         return null;
     }
 }));

或者

ExecutorService executorService = Executors.newFixedThreadPool(1);
 executorService.execute(RunnableWrapper.of(new Runnable() {
     @Override public void run() {
         //your code
     }
 }));
  1. 使用3
 @TraceCrossThread
 public class MySupplier<String> implements Supplier<String> {
     @Override
     public String get() {
         return null;
     }
 }
...
 CompletableFuture.supplyAsync(new MySupplier<String>());

或者

  CompletableFuture.supplyAsync(SupplierWrapper.of(()->{
           return "SupplierWrapper";
   })).thenAccept(System.out::println);
  1. 使用4
 CompletableFuture.supplyAsync(SupplierWrapper.of(() -> {
       return "SupplierWrapper";
   })).thenAcceptAsync(ConsumerWrapper.of(c -> {
       // your code visit(url)
       System.out.println("ConsumerWrapper");
   }));

或者

CompletableFuture.supplyAsync(SupplierWrapper.of(() -> {
       return "SupplierWrapper";
   })).thenApplyAsync(FunctionWrapper.of(f -> {
       // your code visit(url)
       return "FunctionWrapper";
   }));
参考
  1. trace cross thread

更多推荐