Uploaded image for project: 'TomEE'
  1. TomEE
  2. TOMEE-2653

TomEE throws a JMS2 exception when the request CDI Scope closes down, if you thread is in an interrupted state

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Resolved
    • Major
    • Resolution: Fixed
    • 7.0.6, 7.1.1, 8.0.0-M3
    • 8.0.0-Final
    • 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.

      Attachments

        Activity

          People

            exabrial Jonathan S Fisher
            exabrial Jonathan S Fisher
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: