-
Notifications
You must be signed in to change notification settings - Fork 1.7k
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
agent 类增强后 netty的线程池报错 #133
Comments
这个 Issue #121 (comment) 也涉及这个问题,
需要 可以把这个需求做一下,发个 |
现在 在
当然 升级 |
|
@woshioosm 很好的思路和实现验证! 👍 我也想一下 ❤️ 这样的做法,目前想到的可能需要注意的问题:
|
String consCode2 = "isApiTtl=($1 instanceof com.alibaba.ttl.TtlCallable || $1 instanceof com.alibaba.ttl.TtlRunnable)?true:false;";
|
@oldratlee 你好, 我们在trace系统中引入了ttl.同样遇到用户在beforeExecutor方法中,强转runnable的类型报错。 我的解决方法是 agent增强的时候,拦截所有的ExecutorService派生出来的类,把它们的beforeExecutor和afterExecutor都增强下,从TtlRunnable取出用户原始的类型,然后还回去。 这种方式你觉得会有什么隐患吗? |
在版本
实现方式 即 是你的思路: @auyang-0626
另外加的判断逻辑是: 只在 |
Lines 104 to 110 in c55acbd
看代码是根据 如果用户调用线程池 这样的话,如果用户在自定义 不知道理解的对不对,求大佬解答。 @oldratlee 测试code: public static void main(String[] args) {
MyThreadPoolExecutor myThreadPoolExecutor = new MyThreadPoolExecutor(1, 1, 1, TimeUnit.MINUTES, new LinkedBlockingQueue<>());
myThreadPoolExecutor.execute(TtlRunnable.get(() -> System.out.println("agent test")));
}
static class MyThreadPoolExecutor extends ThreadPoolExecutor {
public MyThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
}
@Override
protected void beforeExecute(Thread t, Runnable r) {
TtlRunnable ttlRunnable = (TtlRunnable) r;
super.beforeExecute(t, r);
}
} |
@DreamLettuce 问题收到!
你的理解及其分析 是对的,非常专业! 👍 ❤️ @DreamLettuce 这是 一个 在
我尽快 release 一个版本,修复问题。对于独立的问题(如实现
|
…en auto wrapped for issue #133 (comment)
问题复现在复现提交 32adad1 的单元测试中,添加了复现的 Lines 58 to 76 in 32adad1
集成测试失败并复现问题: There was 1 failure:
1) underAgent_task_is_explicit_TtlRunnable__should_not_be_unwrapped(com.alibaba.test.ttl.threadpool.BeforeAndAfterExecuteMethodOfExecutorSubclassTest)
java.lang.AssertionError
at org.junit.Assert.fail(Assert.java:87)
at org.junit.Assert.assertTrue(Assert.java:42)
at org.junit.Assert.assertTrue(Assert.java:53)
at com.alibaba.test.ttl.threadpool.BeforeAndAfterExecuteMethodOfExecutorSubclassTest.underAgent_task_is_explicit_TtlRunnable__should_not_be_unwrapped(BeforeAndAfterExecuteMethodOfExecutorSubclassTest.kt:75)
FAILURES!!! 问题修复
发布发了 <dependency>
<groupId>com.alibaba</groupId>
<artifactId>transmittable-thread-local</artifactId>
<version>2.12.6</version>
</dependency> @DreamLettuce 可以用一下这个新版本,确认是否解决你的问题。 |
…en auto wrapped for issue #133 (comment)
目前没有实际的业务场景,只是我们目前使用TTL( 我也觉得一般情况下业务使用了agent不会再直接调用TtlRunnable对象,但是也有可能先使用了Java SDK,后续如果改为使用agent可能会暴露这个问题。 |
推荐跟进升级,避免再踩新版本中已经解决了的问题。@DreamLettuce 具体看各个版本 release note 中的说明: |
netty的线程池 默认使用的是 MemoryAwareThreadPoolExecutor 该Executor中定义了 自己的runnable实现MemoryAwareRunnable。
使用ttl增强后报错:
具体报错就是 netty 想把task转成自己的runnable是类型错误
increment = ((MemoryAwareRunnable) task).estimatedSize;
同理 对于其他自定义线程池和runnable的程序 , 通过增强使用TtlRunnable 是否有风险?
The text was updated successfully, but these errors were encountered: