Details
-
Bug
-
Status: Resolved
-
Major
-
Resolution: Fixed
-
7.0.6, 7.1.1, 8.0.0-M3
-
None
-
None
Description
TomEE throws a JMS2 exception when the request CDI Scope closes down, if you thread is in an interrupted state.
Let's say you start a message consumer in a request scoped context. If you interrupt the thread (stopping the consumer) and close the consumer properly, TomEE will throw an exception when it cleans up the request scope (the point at which closes the JMS Context, per the JMS 2.0 spec).
SEVERE: Exception thrown while destroying bean instance : [RequestAutoContextDestruction, WebBeansType:MANAGED, Name:null, API Types:[org.apache.openejb.resource.activemq.jms2.cdi.JMS2CDIExtension$RequestAutoContextDestruction,java.lang.Object,org.apache.openejb.resource.activemq.jms2.cdi.JMS2CDIExtension$AutoContextDestruction,java.io.Serializable], Qualifiers:[javax.enterprise.inject.Default,javax.enterprise.inject.Any]] javax.jms.JMSRuntimeException: java.io.InterruptedIOException at org.apache.openejb.resource.activemq.jms2.JMS2.toRuntimeException(JMS2.java:86) at org.apache.openejb.resource.activemq.jms2.JMSContextImpl.close(JMSContextImpl.java:155) at org.apache.openejb.resource.activemq.jms2.cdi.JMS2CDIExtension$AutoContextDestruction.destroy(JMS2CDIExtension.java:158) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.webbeans.intercept.LifecycleInterceptorInvocationContext.proceed(LifecycleInterceptorInvocationContext.java:103) at org.apache.webbeans.portable.InjectionTargetImpl.preDestroy(InjectionTargetImpl.java:352) at org.apache.webbeans.component.AbstractOwbBean.destroy(AbstractOwbBean.java:179) at org.apache.webbeans.context.AbstractContext.destroyInstance(AbstractContext.java:206) at org.apache.webbeans.context.AbstractContext.destroyInstance(AbstractContext.java:192) at org.apache.webbeans.context.AbstractContext.destroy(AbstractContext.java:218) at org.apache.webbeans.web.context.ServletRequestContext.destroy(ServletRequestContext.java:69) at org.apache.webbeans.web.context.WebContextsService.destroyRequestContext(WebContextsService.java:426) at org.apache.openejb.cdi.CdiAppContextsService.destroyRequestContext(CdiAppContextsService.java:113) at org.apache.webbeans.web.context.WebContextsService.endContext(WebContextsService.java:223) at org.apache.deltaspike.cdise.owb.OpenWebBeansContextControl.stopRequestScope(OpenWebBeansContextControl.java:230) at org.apache.deltaspike.cdise.owb.OpenWebBeansContextControl.stopContext(OpenWebBeansContextControl.java:104) at com.xxx.ContactActivityMonitor.run(ContactActivityMonitor.java:94) at org.apache.openejb.threads.task.CURunnable$1.call(CURunnable.java:35) at org.apache.openejb.threads.task.CURunnable$1.call(CURunnable.java:32) at org.apache.openejb.threads.task.CUTask.invoke(CUTask.java:100) at org.apache.openejb.threads.task.CURunnable.run(CURunnable.java:32) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) Caused by: javax.jms.JMSException: java.io.InterruptedIOException at org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:72) at org.apache.activemq.ActiveMQConnection.doAsyncSendPacket(ActiveMQConnection.java:1310) at org.apache.activemq.ActiveMQConnection.asyncSendPacket(ActiveMQConnection.java:1302) at org.apache.activemq.ActiveMQSession.doClose(ActiveMQSession.java:666) at org.apache.activemq.ActiveMQSession.close(ActiveMQSession.java:657) at org.apache.openejb.resource.activemq.jms2.JMSContextImpl.close(JMSContextImpl.java:147) ... 29 more Caused by: java.io.InterruptedIOException at org.apache.activemq.transport.vm.VMTransport.oneway(VMTransport.java:128) at org.apache.activemq.transport.MutexTransport.oneway(MutexTransport.java:68) at org.apache.activemq.transport.ResponseCorrelator.oneway(ResponseCorrelator.java:60) at org.apache.activemq.ActiveMQConnection.doAsyncSendPacket(ActiveMQConnection.java:1308) ... 33 more Caused by: java.lang.InterruptedException at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireInterruptibly(AbstractQueuedSynchronizer.java:1220) at java.util.concurrent.locks.ReentrantLock.lockInterruptibly(ReentrantLock.java:335) at java.util.concurrent.LinkedBlockingQueue.put(LinkedBlockingQueue.java:339) at org.apache.activemq.transport.vm.VMTransport.oneway(VMTransport.java:97) ... 36 more
This appears to be a result JMSContextImpl attempting to close both the session and the connection:
@Override public void close() { try { synchronized (this) { if (session != null) { session.close(); } if (connection != null) { connection.close(); } closed = true; } } catch (final JMSException e) { throw toRuntimeException(e); } }
Per the JMS Connection spec, closing the connection should be more than sufficient to cleanup.