[ 
https://issues.apache.org/jira/browse/AMQ-3567?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Claudio Corsi updated AMQ-3567:
-------------------------------

    Attachment: inactivitymonitor.patch

Here is the patch for this issue.

The patch also includes a test that will reproduce the exception but the thing 
to note is that to be able to confirm that the patch worked.  I needed to use 
the underlying log4j logging implementation.  The test will depend on that to 
be able to confirm that it works.  If in the future activemq intends to use a 
different slf4j bridge then this test case will need to be updated.

                
> The InactivityMonitor onException call interrupts itself when the 
> readCheckTime was exceeded.
> ---------------------------------------------------------------------------------------------
>
>                 Key: AMQ-3567
>                 URL: https://issues.apache.org/jira/browse/AMQ-3567
>             Project: ActiveMQ
>          Issue Type: Bug
>          Components: JMS client
>    Affects Versions: 5.5.0, 5.5.1
>            Reporter: Claudio Corsi
>            Priority: Trivial
>              Labels: patch
>             Fix For: 5.5.0, 5.5.1, 5.6.0
>
>         Attachments: inactivitymonitor.patch
>
>
> The process that activemq uses to check if there has been inactivity for a 
> connection has a flaw when it tries to close the connection because of 
> inactivity. The current process generates the following interrupt exception. 
> {code} 
> 2011-10-25 12:13:56,878 | DEBUG | org.apache.activemq.util.ServiceSupport - 
> Could not stop service: tcp://localhost/127.0.0.1:61616. Reason: 
> java.lang.InterruptedException
> java.lang.InterruptedException
>     at 
> java.util.concurrent.locks.AbstractQueuedSynchronizer.tryAcquireSharedNanos(AbstractQueuedSynchronizer.java:1302)
>     at java.util.concurrent.CountDownLatch.await(CountDownLatch.java:253)
>     at 
> org.apache.activemq.transport.tcp.TcpTransport.doStop(TcpTransport.java:553)
>     at org.apache.activemq.util.ServiceSupport.stop(ServiceSupport.java:70)
>     at 
> org.apache.activemq.transport.tcp.TcpTransport.stop(TcpTransport.java:570)
>     at 
> org.apache.activemq.transport.InactivityMonitor.stop(InactivityMonitor.java:132)
>     at 
> org.apache.activemq.transport.TransportFilter.stop(TransportFilter.java:65)
>     at 
> org.apache.activemq.transport.WireFormatNegotiator.stop(WireFormatNegotiator.java:91)
>     at org.apache.activemq.util.ServiceSupport.dispose(ServiceSupport.java:43)
>     at 
> org.apache.activemq.transport.failover.FailoverTransport.disposeTransport(FailoverTransport.java:207)
>     at 
> org.apache.activemq.transport.failover.FailoverTransport.handleTransportFailure(FailoverTransport.java:223)
>     at 
> org.apache.activemq.transport.failover.FailoverTransport$3.onException(FailoverTransport.java:184)
>     at 
> org.apache.activemq.transport.TransportFilter.onException(TransportFilter.java:101)
>     at 
> org.apache.activemq.transport.WireFormatNegotiator.onException(WireFormatNegotiator.java:160)
>     at 
> org.apache.activemq.transport.InactivityMonitor.onException(InactivityMonitor.java:265)
>     at 
> org.apache.activemq.transport.InactivityMonitor$4.run(InactivityMonitor.java:185)
>     at 
> java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
>     at 
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
>     at java.lang.Thread.run(Thread.java:680)
> {code} 
> This is caused because the spawned thread in the AbstractInactivityMonitor 
> classes readCheck method calls the onException method. This method will then 
> call the stopMonitorThreads method which subsequently calls the shutdownNow 
> method of the ASYNC_TASKS executor. This call causes the executor to call the 
> interrupt method for all active threads in the executor. The problem is that 
> the calling thread is part of the ASYNC_TASKS executor and therefore it is 
> generating the interrupt exception. 
> Here is the stack trace of the call that is causing the interrupt. 
> {code} 
> Daemon Thread [InactivityMonitor Async Task: 
> java.util.concurrent.ThreadPoolExecutor$Worker@66da9ea4] (Suspended (entry 
> into method interrupt in Thread))   
>     Thread.interrupt() line: 902   
>     ThreadPoolExecutor$Worker.interruptNow() line: 855   
>     ThreadPoolExecutor.shutdownNow() line: 1167   
>     InactivityMonitor.stopMonitorThreads() line: 363   
>     InactivityMonitor.onException(IOException) line: 264   
>     InactivityMonitor$4.run() line: 185   
>     ThreadPoolExecutor$Worker.runTask(Runnable) line: 886   
>     ThreadPoolExecutor$Worker.run() line: 908   
>     Thread.run() line: 680  
> {code} 
> The solution is to replace the shutdownNow method call with shutdown. 
> Subsequent testing with this change does not cause the interrupt exception. 
> I was able to create a testcase that reproduces this issue. The testcase uses 
> the useInactivityMonitor=false attribute to reproduce this issue, thanks Gary 
> for the hint. Unfortunately there aren't any steps that I can use to 
> determine that the raised interrupted exception was raised or not. The test 
> will pass either way. 
> A patch will be added to this issue.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to