alibaba / transmittable-thread-local

📌 a missing Java std lib(simple & 0-dependency) for framework/middleware, provide an enhanced InheritableThreadLocal that transmits values between threads even using thread pooling components.
https://github.com/alibaba/transmittable-thread-local
Apache License 2.0
7.59k stars 1.69k forks source link

FutureTask/CompletableFuture的异步任务场景下,TTL的使用 #154

Closed liaofanxin closed 4 years ago

liaofanxin commented 4 years ago

请问在JDK1.8,CompletableFuture的异步任务的时候,如果做兼容?有demo可以参考一下吗

oldratlee commented 4 years ago

1. FutureTask

你说到的FutureTask是指java.util.concurrent.FutureTask,是吧。 @liaofanxin

java.util.concurrent.FutureTaskRunnable,一般是在ThreadPoolExecutor中执行,可以通过TTL文档的说明的方法来使用:

这3个背后都是修饰Runnable,只是使用方式不同。

2. CompletableFuture

CompletableFuture的执行,缺省使用ForkJoinPool作为执行器,底下转成ForkJoinPoolForkJoinTask来执行,使用文档中2.3 使用Java Agent来修饰JDK线程池实现类的方式,透明支持CompletableFuture的TTL:

image

参见Issue

3. Stream

与上面的CompletableFuture一样,(并行执行的)Stream底层通过ForkJoinPool执行。

所以也是使用 文档中2.3 使用Java Agent来修饰JDK线程池实现类的方式,透明支持Stream的TTL。

参见Issue

liaofanxin commented 4 years ago

多谢回复,已经找到解决办法,项目中已经引入,测试没问题,已发布上线

发自我的iPhone

------------------ 原始邮件 ------------------ 发件人: 李鼎(哲良) <notifications@github.com> 发送时间: 2019年11月29日 21:32 收件人: alibaba/transmittable-thread-local <transmittable-thread-local@noreply.github.com> 抄送: 辛令剑 <804544174@qq.com>, Mention <mention@noreply.github.com> 主题: 回复:[alibaba/transmittable-thread-local] FutureTask/CompletableFuture的异步任务场景下,TTL的使用 (#154)

Closed #154.

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub, or unsubscribe.

oldratlee commented 4 years ago

已经找到解决办法,项目中已经引入,测试没问题,已发布上线

👏👍

能说一下你的场景和解决方法吗?😀 ❤️@liaofanxin

liaofanxin commented 4 years ago

使用场景

项目的日志tag(例如用户uid,订单id等),采用threadlocal来进行透传,但是在启用future或者threadpool来执行异步任务的时候,threadlocal中的日志tag是不能正常传递的。

原因

  1. threadlocal线程隔离
  2. InherbritableThreadLocal虽然可以解决线程隔离问题,但是无法解决线程池线程复用导致的日志tag混乱问题

原先解决方案:

  1. 执行异步任务前重新获取threadlocal中的tag,然后在开启新任务的地方重新setThreadlocal
  2. tag作为参数进行传递

引入TTL后的方案

  1. 采用ttl的TransmittableThreadLocal存储日志tag
  2. 用TtlExecutors封装ThreadPool帮助类
  3. 使用CompletableFuture并制定Executor

发自我的iPhone

------------------ 原始邮件 ------------------ 发件人: 李鼎(哲良) <notifications@github.com> 发送时间: 2019年11月29日 21:45 收件人: alibaba/transmittable-thread-local <transmittable-thread-local@noreply.github.com> 抄送: 辛令剑 <804544174@qq.com>, Mention <mention@noreply.github.com> 主题: 回复:[alibaba/transmittable-thread-local] FutureTask/CompletableFuture的异步任务场景下,TTL的使用 (#154)

能说一下你的场景和解决方法吗?😀 @liaofanxin

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub, or unsubscribe.

oldratlee commented 4 years ago

引入TTL后的方案

……

  1. 使用CompletableFuture并制定Executor

关于『使用CompletableFuture并制定Executor』这点,对CompletableFuture及其使用ForkJoinPool Executor你是如何定制的? @liaofanxin 😁

liaofanxin commented 4 years ago

使用了2.3对用ForkJoinPool Executor进行修饰

发自我的iPhone

------------------ 原始邮件 ------------------ 发件人: 李鼎(哲良) <notifications@github.com> 发送时间: 2019年11月30日 14:13 收件人: alibaba/transmittable-thread-local <transmittable-thread-local@noreply.github.com> 抄送: 辛令剑 <804544174@qq.com>, Mention <mention@noreply.github.com> 主题: 回复:[alibaba/transmittable-thread-local] FutureTask/CompletableFuture的异步任务场景下,TTL的使用 (#154)

引入TTL后的方案

……

  1. 使用CompletableFuture并制定Executor

关于『使用CompletableFuture并制定Executor』这点,对CompletableFuture及其使用ForkJoinPool Executor你是如何定制的? @liaofanxin

使用了『2.3 使用Java Agent来修饰JDK线程池实现类』的Java Agent方式吗?

如果没有使用Java Agent,你是如何做的?

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub, or unsubscribe.

LouisProgress commented 1 year ago

CompletableFuture

对的CompletableFuture的支持,能否分享一个demo,感谢!

liaofanxin commented 1 year ago

你好,您刚才发给我的邮件我已经收到! 祝工作顺利,事事顺心! 谢谢你的邮件!