Uploaded image for project: 'ActiveMQ Classic'
  1. ActiveMQ Classic
  2. AMQ-2526

Questionable processing of interruptions in TcpTransport::doStop

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Resolved
    • Major
    • Resolution: Fixed
    • 5.2.0, 5.3.0
    • 5.6.0
    • Transport
    • None

    Description

      Imagine you are processing a few jobs by a thread pool. A timeout is set for the whole batch. A job should send a JMS message. If the timeout expires before all the jobs are completed the pool will interrupt still running jobs.

      Most of the time the interruption will be caught and processed deep inside of ActiveMQ TCP transport classes. While I'm not entirely convinced it's a good idea to shut down and reopen the connection to the ActiveMQ server if a client thread is merely interrupted what really seems ugly is:

      15:12:53,745 ERROR [org.apache.activemq.transport.tcp.TcpTransport] Could not stop service: tcp:///x.x.x.x:61616. Reason: java.lang.InterruptedException
      java.lang.InterruptedException
      at java.util.concurrent.locks.AbstractQueuedSynchronizer.tryAcquireSharedNanos(AbstractQueuedSynchronizer.java:1200)
      at java.util.concurrent.CountDownLatch.await(CountDownLatch.java:245)
      at org.apache.activemq.transport.tcp.TcpTransport.doStop(TcpTransport.java:482)
      at org.apache.activemq.util.ServiceSupport.stop(ServiceSupport.java:69)
      at org.apache.activemq.transport.tcp.TcpTransport.stop(TcpTransport.java:499)
      at org.apache.activemq.transport.InactivityMonitor.stop(InactivityMonitor.java:113)
      at org.apache.activemq.transport.TransportFilter.stop(TransportFilter.java:64)
      at org.apache.activemq.transport.WireFormatNegotiator.stop(WireFormatNegotiator.java:87)
      at org.apache.activemq.util.ServiceSupport.dispose(ServiceSupport.java:43)
      at org.apache.activemq.transport.failover.FailoverTransport.handleTransportFailure(FailoverTransport.java:201)
      at org.apache.activemq.transport.failover.FailoverTransport.oneway(FailoverTransport.java:471)
      at org.apache.activemq.transport.MutexTransport.oneway(MutexTransport.java:40)
      at org.apache.activemq.transport.ResponseCorrelator.oneway(ResponseCorrelator.java:60)
      at org.apache.activemq.ActiveMQConnection.doAsyncSendPacket(ActiveMQConnection.java:1214)
      at org.apache.activemq.ActiveMQConnection.asyncSendPacket(ActiveMQConnection.java:1208)
      at org.apache.activemq.ActiveMQSession.send(ActiveMQSession.java:1643)
      at org.apache.activemq.ActiveMQMessageProducer.send(ActiveMQMessageProducer.java:227)
      at org.apache.activemq.ActiveMQMessageProducerSupport.send(ActiveMQMessageProducerSupport.java:241)

      and the reason for it is that the await call on the CountDownLatch in TcpTransport::doStop will throws an InterruptedException if the calling thread is already interrupted. No attempt is made (in both 5.2 or 5.3) to gracefully process InterruptedException, the exception itself is logged as ERROR with a rather menacing message and the log file gets full of meaningless stack traces although no real harm was done.

      Calling latch.await(1,TimeUnit.SECONDS) in a try block seems like a no-brainer but there could be even smarted approaches to processing InterruptedExceptions differently than, say, IOEs and other genuine problems.

      Attachments

        1. Test.java
          4 kB
          Nikita Dolgov

        Activity

          People

            Unassigned Unassigned
            ndolgov Nikita Dolgov
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: