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

加入agent后报TtlTransformer: Fail to transform class xxx 错误 #516

Closed luger1990 closed 1 year ago

luger1990 commented 1 year ago

加入agent的参数为:

<jvmFlag>-javaagent:/java-agent/ttl-jar/transmittable-thread-local.jar=ttl.agent.logger:STDOUT</jvmFlag>
<jvmFlag>-Xbootclasspath/a:/java-agent/ttl-jar/transmittable-thread-local.jar</jvmFlag>

加入agent后项目启动后报错,但是不影响项目运行,报错如下:

2023-06-08T19:44:56.361+07:00  INFO 1 --- [           main] o.a.c.loader.WebappClassLoaderBase       : Illegal access: this web application instance has been stopped already. Could not load [java/util/concurrent/ThreadPoolExecutor.class]. The following stack trace is thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access.

java.lang.IllegalStateException: Illegal access: this web application instance has been stopped already. Could not load [java/util/concurrent/ThreadPoolExecutor.class]. The following stack trace is thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access.
    at org.apache.catalina.loader.WebappClassLoaderBase.checkStateForResourceLoading(WebappClassLoaderBase.java:1457) ~[tomcat-embed-core-10.1.8.jar:10.1.8]
    at org.apache.catalina.loader.WebappClassLoaderBase.getResource(WebappClassLoaderBase.java:1047) ~[tomcat-embed-core-10.1.8.jar:10.1.8]
    at com.alibaba.ttl.threadpool.agent.internal.javassist.LoaderClassPath.find(LoaderClassPath.java:90) ~[na:na]
    at com.alibaba.ttl.threadpool.agent.internal.javassist.ClassPoolTail.find(ClassPoolTail.java:364) ~[na:na]
    at com.alibaba.ttl.threadpool.agent.internal.javassist.ClassPool.find(ClassPool.java:561) ~[na:na]
    at com.alibaba.ttl.threadpool.agent.internal.javassist.ClassPool.createCtClass(ClassPool.java:545) ~[na:na]
    at com.alibaba.ttl.threadpool.agent.internal.javassist.ClassPool.get0(ClassPool.java:510) ~[na:na]
    at com.alibaba.ttl.threadpool.agent.internal.javassist.ClassPool.get(ClassPool.java:419) ~[na:na]
    at com.alibaba.ttl.threadpool.agent.internal.transformlet.impl.TtlExecutorTransformlet.doTransform(TtlExecutorTransformlet.java:73) ~[na:na]
    at com.alibaba.ttl.threadpool.agent.TtlTransformer.transform(TtlTransformer.java:58) ~[na:na]
    at java.instrument/java.lang.instrument.ClassFileTransformer.transform(ClassFileTransformer.java:244) ~[na:na]
    at java.instrument/sun.instrument.TransformerManager.transform(TransformerManager.java:188) ~[na:na]
    at java.instrument/sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:541) ~[na:na]
    at java.base/java.lang.ClassLoader.defineClass1(Native Method) ~[na:na]
    at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1012) ~[na:na]
    at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150) ~[na:na]
    at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:862) ~[na:na]
    at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:760) ~[na:na]
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:681) ~[na:na]
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:639) ~[na:na]
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) ~[na:na]
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520) ~[na:na]
    at org.apache.catalina.core.ApplicationContextFacade.setAttribute(ApplicationContextFacade.java:314) ~[tomcat-embed-core-10.1.8.jar:10.1.8]
    at org.apache.catalina.loader.WebappLoader.setClassPath(WebappLoader.java:559) ~[tomcat-embed-core-10.1.8.jar:10.1.8]
    at org.apache.catalina.loader.WebappLoader.startInternal(WebappLoader.java:375) ~[tomcat-embed-core-10.1.8.jar:10.1.8]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-10.1.8.jar:10.1.8]
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4747) ~[tomcat-embed-core-10.1.8.jar:10.1.8]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-10.1.8.jar:10.1.8]
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1332) ~[tomcat-embed-core-10.1.8.jar:10.1.8]
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1322) ~[tomcat-embed-core-10.1.8.jar:10.1.8]
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na]
    at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) ~[tomcat-embed-core-10.1.8.jar:10.1.8]
    at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:145) ~[na:na]
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:871) ~[tomcat-embed-core-10.1.8.jar:10.1.8]
    at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:846) ~[tomcat-embed-core-10.1.8.jar:10.1.8]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-10.1.8.jar:10.1.8]
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1332) ~[tomcat-embed-core-10.1.8.jar:10.1.8]
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1322) ~[tomcat-embed-core-10.1.8.jar:10.1.8]
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na]
    at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) ~[tomcat-embed-core-10.1.8.jar:10.1.8]
    at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:145) ~[na:na]
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:871) ~[tomcat-embed-core-10.1.8.jar:10.1.8]
    at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:241) ~[tomcat-embed-core-10.1.8.jar:10.1.8]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-10.1.8.jar:10.1.8]
    at org.apache.catalina.core.StandardService.startInternal(StandardService.java:428) ~[tomcat-embed-core-10.1.8.jar:10.1.8]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-10.1.8.jar:10.1.8]
    at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:913) ~[tomcat-embed-core-10.1.8.jar:10.1.8]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-10.1.8.jar:10.1.8]
    at org.apache.catalina.startup.Tomcat.start(Tomcat.java:485) ~[tomcat-embed-core-10.1.8.jar:10.1.8]
    at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.initialize(TomcatWebServer.java:123) ~[spring-boot-3.1.0.jar:3.1.0]
    at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.<init>(TomcatWebServer.java:104) ~[spring-boot-3.1.0.jar:3.1.0]
    at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getTomcatWebServer(TomcatServletWebServerFactory.java:489) ~[spring-boot-3.1.0.jar:3.1.0]
    at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getWebServer(TomcatServletWebServerFactory.java:211) ~[spring-boot-3.1.0.jar:3.1.0]
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.java:183) ~[spring-boot-3.1.0.jar:3.1.0]
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:161) ~[spring-boot-3.1.0.jar:3.1.0]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:602) ~[spring-context-6.0.9.jar:6.0.9]
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.1.0.jar:3.1.0]
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:733) ~[spring-boot-3.1.0.jar:3.1.0]
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:435) ~[spring-boot-3.1.0.jar:3.1.0]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:311) ~[spring-boot-3.1.0.jar:3.1.0]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1305) ~[spring-boot-3.1.0.jar:3.1.0]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1294) ~[spring-boot-3.1.0.jar:3.1.0]
    at com.nct.player.search.AppApplication.main(AppApplication.java:27) ~[classes/:na]

2023-06-08 19:44:56.373 SEVERE [main] TtlTransformer: Fail to transform class org/apache/catalina/security/SecurityUtil, cause: java.lang.IllegalStateException: Illegal access: this web application instance has been stopped already. Could not load [java/util/concurrent/ThreadPoolExecutor.class]. The following stack trace is thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access.
java.lang.IllegalStateException: Illegal access: this web application instance has been stopped already. Could not load [java/util/concurrent/ThreadPoolExecutor.class]. The following stack trace is thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access.
    at org.apache.catalina.loader.WebappClassLoaderBase.checkStateForResourceLoading(WebappClassLoaderBase.java:1457)
    at org.apache.catalina.loader.WebappClassLoaderBase.getResource(WebappClassLoaderBase.java:1047)
    at com.alibaba.ttl.threadpool.agent.internal.javassist.LoaderClassPath.find(LoaderClassPath.java:90)
    at com.alibaba.ttl.threadpool.agent.internal.javassist.ClassPoolTail.find(ClassPoolTail.java:364)
    at com.alibaba.ttl.threadpool.agent.internal.javassist.ClassPool.find(ClassPool.java:561)
    at com.alibaba.ttl.threadpool.agent.internal.javassist.ClassPool.createCtClass(ClassPool.java:545)
    at com.alibaba.ttl.threadpool.agent.internal.javassist.ClassPool.get0(ClassPool.java:510)
    at com.alibaba.ttl.threadpool.agent.internal.javassist.ClassPool.get(ClassPool.java:419)
    at com.alibaba.ttl.threadpool.agent.internal.transformlet.impl.TtlExecutorTransformlet.doTransform(TtlExecutorTransformlet.java:73)
    at com.alibaba.ttl.threadpool.agent.TtlTransformer.transform(TtlTransformer.java:58)
    at java.instrument/java.lang.instrument.ClassFileTransformer.transform(ClassFileTransformer.java:244)
    at java.instrument/sun.instrument.TransformerManager.transform(TransformerManager.java:188)
    at java.instrument/sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:541)
    at java.base/java.lang.ClassLoader.defineClass1(Native Method)
    at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1012)
    at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150)
    at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:862)
    at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:760)
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:681)
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:639)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)
    at org.apache.catalina.core.ApplicationContextFacade.setAttribute(ApplicationContextFacade.java:314)
    at org.apache.catalina.loader.WebappLoader.setClassPath(WebappLoader.java:559)
    at org.apache.catalina.loader.WebappLoader.startInternal(WebappLoader.java:375)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4747)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1332)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1322)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
    at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:145)
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:871)
    at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:846)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1332)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1322)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
    at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:145)
    at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:871)
    at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:241)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
    at org.apache.catalina.core.StandardService.startInternal(StandardService.java:428)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
    at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:913)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
    at org.apache.catalina.startup.Tomcat.start(Tomcat.java:485)
    at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.initialize(TomcatWebServer.java:123)
    at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.<init>(TomcatWebServer.java:104)
    at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getTomcatWebServer(TomcatServletWebServerFactory.java:489)
    at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getWebServer(TomcatServletWebServerFactory.java:211)
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.java:183)
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:161)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:602)
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:733)
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:435)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:311)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1305)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1294)
    at com.nct.player.search.AppApplication.main(AppApplication.java:27)
2023-06-08T19:44:56.378+07:00  INFO 1 --- [           main] o.a.c.loader.WebappClassLoaderBase       : Illegal access: this web application instance has been stopped already. Could not load [java/util/concurrent/ThreadPoolExecutor.class]. The following stack trace is thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access.

java.lang.IllegalStateException: Illegal access: this web application instance has been stopped already. Could not load [java/util/concurrent/ThreadPoolExecutor.class]. The following stack trace is thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access.
oldratlee commented 1 year ago

@luger1990 你的这个应用使用了java9 jigsaw模块化? 你可以先查一下使用模块化需要的额外配置。

PS:TTL库目前没有java9 jigsaw模块化。

luger1990 commented 1 year ago

@luger1990 你的这个应用使用了java9 jigsaw模块化? 你可以先查一下使用模块化需要的额外配置。

PS:TTL库目前没有java9 jigsaw模块化。

应该没有用模块化,用的是jdk17

oldratlee commented 1 year ago

应该没有用模块化

请实际具体核实。 @luger1990


@luger1990 请给 一个 极简的 可运行复现问题 的代码实现/Demo。❤️

推荐提供成一个单独的工程(GitHub repo)。这样可以

PS:

TTL v2.x的持续集成 包含了JDK 17Agent运行方式的测试,且是OK的。

其中一次运行 https://github.com/alibaba/transmittable-thread-local/actions/runs/4776850295/jobs/8492153720

luger1990 commented 1 year ago

应该没有用模块化

请实际具体核实。 @luger1990

@luger1990 请给 一个 极简的 可运行复现问题 的代码实现/Demo。❤️

推荐提供成一个单独的工程(Github repo)。这样可以

  • 方便大家能排查分析(只提供运行结果,排查信息不足)
  • 方便分离不相关的业务实现内容,以及排除可能的业务使用问题

PS: TTL v2.x的持续集成 包含了JDK 17Agent运行方式的测试,且是OK的。 其中一次运行 https://github.com/alibaba/transmittable-thread-local/actions/runs/4776850295/jobs/8492153720

好的 我试试。多谢!