TomEE Plume 9.1.0中REST API的TomEEMicroProfileListener调用错误排查
TomEE Plume 9.1.0中JAX-RS类部署时的无影响错误分析
问题场景
我在学习REST API时,发现标注了@Path注解的类部署时会抛出一个不影响应用运行的错误,想查明原因,使用的是TomEE Plume 9.1.0版本。
代码示例
@Path("/rs") public class HelloWorld { @GET @Path("/sayHello") @Produces("text/plain") public String sayHello() { return "Hello world"; } }
错误日志
06-Jan-2024 04:36:46.537 SEVERE [http-nio-8080-exec-4] org.apache.openejb.observer.ObserverManager$MethodInvocation.invoke error invoking org.apache.tomee.microprofile.TomEEMicroProfileListener@2807bdeb java.lang.IllegalStateException: On a thread without an initialized context nor a classloader mapping a deployed app at org.apache.openejb.cdi.ThreadSingletonServiceImpl.get(ThreadSingletonServiceImpl.java:366) at org.apache.openejb.cdi.ThreadSingletonServiceImpl.getContext(ThreadSingletonServiceImpl.java:342) at org.apache.openejb.cdi.ThreadSingletonServiceImpl.get(ThreadSingletonServiceImpl.java:377) at org.apache.openejb.cdi.ThreadSingletonServiceImpl.get(ThreadSingletonServiceImpl.java:71) at org.apache.webbeans.config.WebBeansFinder.getSingletonInstance(WebBeansFinder.java:57) at org.apache.webbeans.config.WebBeansContext.getInstance(WebBeansContext.java:197) at org.apache.webbeans.config.WebBeansContext.currentInstance(WebBeansContext.java:215) at org.apache.webbeans.container.OwbCDI.getWebBeansContext(OwbCDI.java:47) at org.apache.webbeans.container.OwbCDI.instance(OwbCDI.java:52) at org.apache.webbeans.container.OwbCDI.select(OwbCDI.java:97) at io.smallrye.opentracing.SmallRyeTracingDynamicFeature.<init>(SmallRyeTracingDynamicFeature.java:30) at org.apache.tomee.microprofile.TomEEMicroProfileListener.registerMicroProfileJaxRsProviders(TomEEMicroProfileListener.java:150) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) at java.base/java.lang.reflect.Method.invoke(Method.java:578) at org.apache.openejb.observer.ObserverManager$MethodInvocation.invoke(ObserverManager.java:402) at org.apache.openejb.observer.ObserverManager.doFire(ObserverManager.java:111) at org.apache.openejb.observer.ObserverManager.fireEvent(ObserverManager.java:100) at org.apache.openejb.loader.SystemInstance.fireEvent(SystemInstance.java:151) at org.apache.openejb.server.cxf.rs.CxfRsHttpListener.configureFactory(CxfRsHttpListener.java:1328) at org.apache.openejb.server.cxf.rs.CxfRsHttpListener.deployApplication(CxfRsHttpListener.java:665) at org.apache.openejb.server.rest.RESTService.deployApplication(RESTService.java:546) at org.apache.openejb.server.rest.RESTService.afterApplicationCreated(RESTService.java:305) at org.apache.tomee.webservices.TomeeJaxRsService.afterApplicationCreated(TomeeJaxRsService.java:53) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) at java.base/java.lang.reflect.Method.invoke(Method.java:578)
原因分析
这个错误是TomEE集成SmallRye OpenTracing时的线程上下文问题:在部署JAX-RS应用阶段,TomEEMicroProfileListener尝试注册SmallRyeTracingDynamicFeature,但此时线程没有初始化CDI上下文,也没有关联已部署应用的类加载器,导致抛出IllegalStateException。
由于错误仅发生在部署环节,且应用核心逻辑不受影响,所以不会干扰API的正常调用。
解决方案
- 禁用OpenTracing功能:如果不需要微服务追踪,可在TomEE的
conf/system.properties中添加配置:openejb.microprofile.opentracing.enabled=false - 升级TomEE版本:该问题在TomEE 9.1.1及后续版本中已被修复,升级到最新稳定版即可解决。
- 保留功能的适配:若需要OpenTracing,无需修改业务代码,容器层面的上下文初始化问题会在新版本中得到修复。
内容的提问来源于stack exchange,提问作者Steffano Aravico
相关产品推荐
相关产品推荐

