dubbo-cross-thread-extensions
copy dubbo.tag cross thread lightly . it can run with skywalking and ttl .
(you can install with ByteBuddyAgent or use it with -javaagent=<agentjar>
)
Instrumentation instrumentation = ByteBuddyAgent.install(); RunnableOrCallableActivation.install(instrumentation); RpcContext.getClientAttachment().setAttachment(CommonConstants.TAG_KEY, tag); Callable<String> callable = CallableWrapper.of(new Callable<String>() { @Override public String call() throws Exception { return RpcContext.getClientAttachment().getAttachment(CommonConstants.TAG_KEY); } }); ExecutorService threadPool = Executors.newSingleThreadExecutor(); Future<String> result = threadPool.submit(callable);
@DubboCrossThread public class TargetClass implements Runnable{ @Override public void run() { // ... } }
Callable<String> callable = CallableWrapper.of(new Callable<String>() { @Override public String call() throws Exception { return null; } });
Runnable runnable = RunnableWrapper.of(new Runnable() { @Override public void run() { // ... } });
public class DubboCrossThreadAnnotationListener implements ApplicationListener<ApplicationEnvironmentPreparedEvent> { private Logger logger = LoggerFactory.getLogger(DubboCrossThreadAnnotationListener.class); private Instrumentation instrumentation; @Override public void onApplicationEvent(ApplicationEnvironmentPreparedEvent applicationEnvironmentPreparedEvent) { RunnableOrCallableActivation.install(this.instrumentation); logger.info("finished byte buddy installation."); } public DubboCrossThreadAnnotationListener(Instrumentation instrumentation) { this.instrumentation = instrumentation; } private DubboCrossThreadAnnotationListener() { } }
@SpringBootApplication @ComponentScan(basePackages = "org.apache.your-package") public class SpringBootDemoApplication { public static void main(String[] args) { SpringApplication application = new SpringApplication(SpringBootDemoApplication.class); application.addListeners(new DubboCrossThreadAnnotationListener(ByteBuddyAgent.install())); application.run(args); } }
jvm arguments:
-javaagent:transmittable-thread-local-2.14.2.jar -Dskywalking.agent.application_code=tracecallable-ltf1 -Dskywalking.agent.service_name=test12 -Dskywalking.collector.backend_service=172.37.66.195:11800 -javaagent:skywalking-agent.jar
example code:
public class MultiAnnotationWithSwTtl { private static TransmittableThreadLocal<String> context = new TransmittableThreadLocal<>(); public static void main(String[] args) { Instrumentation instrumentation = ByteBuddyAgent.install(); RunnableOrCallableActivation.install(instrumentation); context.set("value-set-in-parent with ttl"); RunnableWrapper runnable = RunnableWrapper.of(new Runnable() { @Override public void run() { System.out.println("parent thread traceId=" + TraceContext.traceId()); RpcContext.getClientAttachment().setAttachment("dubbo.tag", "tagValue"); MyRunnable task = new MyRunnable(); ExecutorService executorService = Executors.newSingleThreadExecutor(); executorService.submit(task); } }); runnable.run(); } @TraceCrossThread // copy traceContext (include traceId) @DubboCrossThread public static class MyRunnable implements Runnable { @Override public void run() { System.out.println("dubbo.tag=" + RpcContext.getClientAttachment().getAttachment("dubbo.tag")); System.out.println("children thread traceId=" + TraceContext.traceId()); System.out.println("ttl context.get()="+context.get()); } } }
output:
parent thread traceId=60cfc24e245d4389b9f40b5b38c33ef6.1.16910355654660001 dubbo.tag=tagValue children thread traceId=60cfc24e245d4389b9f40b5b38c33ef6.1.16910355654660001 ttl context.get()=value-set-in-parent with ttl