Closed Yelijah closed 3 years ago
但是
java.lang.instrument.Instrumentation#retransformClasses
不支持在transform
中为ForkJoinTask
添加fields
:
关于retransformClasses
,我也没有使用过。关于这方面可以通过Agent
的官方文档来了解确认。
添加fields
不成功,可能和Agent
的设置有关系。你可以试试: @Yelijah
TTL
的)Agent
设置,如 <Can-Redefine-Classes>true</Can-Redefine-Classes>
TTL Jar
来验证(通过mvn install
)@Yelijah 有了验证结果,可以反馈一下 :")
PS: 关于运行时动态加载Agent
的Issue:支持运行时加载TTL agent #169
因为一些特殊原因, 必须要运行时动态
agent
能展开来说一下你的需求场景、问题吗? @Yelijah
这样能够
Q1. 不知能否改写TtlForkJoinTransformlet, 使其不直接修改ForkjoinTask, 转而修改ForkJoinPool? Q2. 并且TtlCallable和TtlRunnable都是通过包装类形式实现, 为何TtlRecursiveTask会是抽象类实现?
修饰ForkjoinTask
而不是ForkJoinPool
,实现更简单可靠。(ForkJoinPool
没有找到可靠的实现方式)
相关的说明Issue:TtlExecutors
怎么没有包装ForkJoinPool
的方法 #200
TtlRecursiveTask
是抽象类实现,原因是ForkJoin
本身的API设计不一样。
ForkJoin
功能实现方式,ForkJoinPool
没有 以接口/语义方式 来提供,不方便统一可靠方式的截面拦截
要可靠实现ForkJoinPool
包装有困难。
相关的更多说明参见:
ForkJoinTask.exec() 是抽象类方法,不好包装. ForkJoinWorkerThread.afterTopLevelExec() 限制包内访问,而且runTask()没有类似beforeTopLevelExec()的方法和执行点。 以上是我分析过程的思路和遇到的问题记录下.
上面提到的TTL
设计与实现困难/问题,欢迎解法与建议 😄 @Yelijah
需要动态agent的场景是:
需要动态agent的场景是:
- To B的web应用,需要适配多种web容器环境
- 让客户自行去加启动参数,比较不可控
为了避免升级改动业务代码,让像中间件基础这类的解决方案对业务更透明(如Skywalking
、Promethues
),
使用Java Agent
类加强的方式,是业界 比较常见与主流的方式。
可能很难有 其它更好的透明技术方案,当然对应要做的是 配置JVM
的启动参数;
相对各个升级改动业务代码,Agent
方案还相对实施成本还是比较低的。
也期望业界 能找到 更简单(如 无需JVM
启动参数)的解决方式。 😁 @Yelijah
因为一些特殊原因, 必须要运行时动态
agent
,现已基本完成。但是
java.lang.instrument.Instrumentation#retransformClasses
不支持在transform
中为ForkJoinTask
添加fields
:Q1. 不知能否改写TtlForkJoinTransformlet, 使其不直接修改ForkjoinTask, 转而修改ForkJoinPool? Q2. 并且TtlCallable和TtlRunnable都是通过包装类形式实现, 为何TtlRecursiveTask会是抽象类实现?