View Code? Open in Web Editor
NEW
📌 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.
Home Page: https://github.com/alibaba/transmittable-thread-local
License: Apache License 2.0
Shell 1.13%
Java 60.88%
Kotlin 37.99%
transmittable-thread-local's People
transmittable-thread-local's Issues
如果用户也有Agent,这样可以减少Java参数上Agent参数的个数,简化Agent匹配。
添加了javassist的jar到bootstrapt classloader中,会让应用的javassist的依赖不能生效。
可以通过repackage javassist来规避
主要是清晰地说明MTC使用方式,图比文字更直观:
把 任务提交给线程池时的上下文传递到 任务执行时。
Agent的使用方式,Jar要加到Boot ClassPath上(-Xbootclasspath/a:
)
所以依赖一定要精简。
改成JDK的Log:java.util.logging.Logger
如
使用Timer
继承ThredPool,覆盖了execute方法
通过com.alibaba.mtc.MtContextThreadLocal#mtContextThreadLocalHolder(ThreadLocal类型)来持有MtContextThreadLocal,是通过WeakReference来持有的。
提供TimerTask的MtContext的Wrapper
Agent方式修改TimerTask类
以解决MTC可能失效的问题
在agent修饰jdk线程池中,TTL的修饰执行情况,要看的是
对于线程池不同的使用方式,有没有多次冗余的TTL的修饰。
设计/使用 的 思考分享。
User Guide
Dev Guide
And...
使用方式由:
// 静态方式,设置和读取配置
MtContext .set ("key" , "value" );
MtContext .get ("key" );
改成:
// 一个对象维护一个对象
static MtContext = new MtContext () {
@ Override
protected MtContext initialValue () {
return new FooInfo ();
}
@ Override
protected MtContext childValue (FooInfo parentValue ) {
return new FooInfo (parentValue );
}
}
这样API的好处:
不需要接管对象的创建,这样不需要提供Copyable接口。更友好。
不需要检查调用线程,只能是当前线程 #6 。更安全。
com.alibaba.mtc.MtContextThreadLocal#addMtContextThreadLocal
和com.alibaba.mtc.MtContextThreadLocal#removeMtContextThreadLocal
方法,目前的时间复杂度是O(n)
,n
是MtContextThreadLocal的实例个数。
看了javassist的代码有用类名反射的代码,而repackage改变了类名
方便用户直接引用以规避bootstrap classpath上的依赖冲突问题。
可以使用maven的sharding插件完成依赖生成
恢复子时没有处理子中多余Key的情况,结果是:
子比父多的MtContext被保留在留在子中。
设置子时没有处理子中多余Key的情况,结果是:
在运行子时,有比父多多的Context!
上面2点合起来,结果是:
在子运行中多出来的Key,被一直保留了。
这打破了MtContext执行时独立的上下文的效果。
Hi~
注意到multiple-thread-context
提供了上下文线程变量的传递,并提供了针对Runnable
及Callable
的支持。由于上述场景中有一部分是用在日志中,当前log4j(2)
提供了MDC
的支持。
想问的是,能否提供一个针对其的增强支持,以log4j2
为例已经提供了入口操作的类ThreadContext
,若在Executor
中传递则需要 使用 该类中的 getContext()
and cloneStack()
方法。
此外,框架是否考虑了如何清除这些线程安全变量(以WEB
为例大多数是在filter
里面使用PUT
然后 执行完毕后 POP
或 CLEAR
)——是否有好的建议(以multi-thread-context
的使用为例)。
调用com.alibaba.mtc.MtContextRunnable#get
、com.alibaba.mtc.MtContextCallable#get
方法的意图是保存的是方法调用时的线程上下文。
这样方法如果幂等,则实际效果是之前生成的MtContextRunnable
、MtContextCallable
时所保存的上下文。即抓取的上下文是错的。
如果传入的MtContextRunnable、MtContextCallable应该 FastFail !实现上可以抛出IllegalStateException
异常。
User can override callback method when need prepare biz something before/after task object execute.
See #49