Jonathan S Fisher created TOMEE-2653:
----------------------------------------
Summary: TomEE throws a JMS2 exception when the request CDI Scope
closes down, if you thread is in an interrupted state
Key: TOMEE-2653
URL: https://issues.apache.org/jira/browse/TOMEE-2653
Project: TomEE
Issue Type: Bug
Reporter: Jonathan S Fisher
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).
{code:java}
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
{code}
This appears to be a result JMSContextImpl attempting to close both the session
and the connection:
{code}
@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);
}
}
{code}
Per the JMS Connection spec, closing the connection should be more than
sufficient to cleanup.
--
This message was sent by Atlassian Jira
(v8.3.2#803003)