Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

框架层和业务层零代码改动的基础上,可否使用TTL #171

Closed
HaojunRen opened this issue Apr 8, 2020 · 6 comments
Closed
Assignees
Labels

Comments

@HaojunRen
Copy link

HaojunRen commented Apr 8, 2020

关注TTL蛮久了,使用异步场景比较少,但还是存在,框架上已经存在若干个Threadlocal,在异步调用中会丢失。

需求是

  • 不希望把Threadlocal改成TTL Theadlocal
  • 也不能做到把其它任何Threadlocal对象改成对应的TTL对象
  • 但希望能享受到TTL的便利

总而言之,

  • 目前框架的一切现状保持不变
  • 然后通过引入TTL的包,或者通过Java Agent方式也可
  • 请问贵框架是否具备这个能力

在相关文档中并没有找到答案。不吝赐教,谢谢!

@HankDevelop
Copy link

参考Readme.md中2.3 使用Java Agent来修饰JDK线程池实现类,是可以实现的

@oldratlee
Copy link
Member

oldratlee commented Apr 9, 2020

框架层和业务层零代码改动的基础上,可否使用TTL?

可以的。分成2部分来说明:

关于不修改业务层代码

可以,参见文档『2.3 使用Java Agent来修饰JDK线程池实现类』的说明。(如 @HankDevelop 的评论所说)

关于不修改框架层代码

这点 可以通过 Transmitter.registerThreadLocal方法,参见TransmitterJavaDoc@HaojunRen

这个register逻辑可以在应用启动前期(比如在main方法中)完成,无需去修改各个框架/库的代码。

PS:
关于Transmitter.registerThreadLocal方法,没有在用户文档中说明,后面可以在开发者文档中补上说明。


了解了 欢迎继续交流,具体的使用问题/疑问 欢迎反馈。❤️

@oldratlee oldratlee reopened this Apr 9, 2020
@HaojunRen
Copy link
Author

HaojunRen commented Apr 9, 2020

  1. registerThreadLocal,即意味着agent端还是需要去知道sdk端有多少个threadlocal对象?预先无法全局探测?
  2. registerThreadLocal结束后,通过java agent命令行启动ttl agent即可,就可以达到预期对吧?
  3. sdk里的threadlocal对象在ttl agent跨线程复制后,在sdk使用完毕ttl agent是否做了清除的操作

@oldratlee
Copy link
Member

oldratlee commented Apr 9, 2020

1. registerThreadLocal,即意味着agent端还是需要去知道sdk端有多少个threadlocal对象?预先无法全局探测?

全局探测,或说是自动加载(完成registerThreadLocal操作),这可以认为是一个TTL集成使用的问题(探测发现 + 自动加载)。

PS:

  • 就像Spring自动扫描Spring配置加载Bean
  • 对于『自动』这样的事,不能做的太魔法,或说 至少要有个声明的步骤。
    比如:添加一个用于探测的自动加载的依赖/Jar
  • 对于registerThreadLocal往往注册的是privateThreadLocal字段实例,与框架库具体的实现相关且可能会变化,应该是不合适放在TTL的core实现(包括TTL Agent)中。
    即因为是 TTL的core实现 的 稳定性 要高于 上层不同的框架。

@HaojunRen 欢迎一起讨论/给出 合适又方便的可能 解决/实现方案、思路及其分析权衡。 😁


  1. registerThreadLocal结束后,通过java agent命令行启动ttl agent即可,就可以达到预期对吧?

目前, registerThreadLocal操作 与 ttl agent的使用 是设计成正交的,即可以独立选择、组合使用。

  • registerThreadLocal操作,是指示ThreadLocal要做跨线程的传递。
    使用TransmittableThreadLocal类型也是这个目的。
  • 使用ttl agent,是为了简化传递过程,简化TtlRunable或线程池的修饰。
    详见文档里的说明:2. 保证线程池中传递值

进一步系统了解,请看资料/文档: @HaojunRen ❤️


  1. sdk里的threadlocal对象在ttl agent跨线程复制后,在sdk使用完毕ttl agent是否做了清除的操作

简单的回答:无需做清除的操作。
原因是 在子线程中的TTL restore的流程方法中完成了。

进一步系统了解,请看上面列的资料 @HaojunRen ❤️

@oldratlee oldratlee added the ❓question Further information is requested label Apr 9, 2020
@HaojunRen
Copy link
Author

HaojunRen commented Apr 9, 2020

非常感谢耐心和专业的回答,进一步请教一下。

例如,我的开源:

github.com/Nepxion/Discovery - discovery-plugin-strategy-starter-zuul/discovery/plugin/strategy/zuul/wrapper/DefaultCallableWrapper.java

RequestContext.getCurrentContext()里的上下文要复制到子线程的ZuulStrategyContext.getCurrentContext(),还有StrategyTracerContext也是类似逻辑,
那么在main方法,应该如何注册registerThreadLocal?谢谢

@oldratlee
Copy link
Member

oldratlee commented Jun 6, 2020

关于『如何注册registerThreadLocal』,可以看一下registerThreadLocal


几次我想看理解你的项目实现、给出示意的使用方式,因为要一段时间而都被中断了…… 😅 @HaojunRen

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

3 participants