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

Jerry Cwiklik closed UIMA-2065.
-------------------------------

    Resolution: Fixed

Added ShutdownHook to enable clean shutdown of UIMA AS client. As part of this, 
a new thread was introduced in the client to process reply messages. Previously 
reply messages were processed in the AMQ dispatch thread, but I was getting 
hangs when ShutdownHook was activated. After painful debugging it looked like 
there was a deadlock between dispatch thread and the ShutdownHook thread. Reply 
message is delivered to the UIMA AS client onMessage() method from within 
critical region in AMQ dispatch code. The dispatch thread is used to process 
the reply and to notify application callback listener. In the listener an 
application calls System.exit() activating the ShutdownHook thread. The jvm 
does not release the dispatch thread however and pins it to the ShutdownHook 
thread via join(). The dispatch thread waits for the ShutdownHook to finish 
which never happens since the ShutdownHook invokes AMQ close() method on a 
connection which attempts to acquire the same lock used by the dispatch thread. 
Deadlock. The solution is to create a dedicated thread in UIMA AS client 
onMessage() method to process replies and return  the dispatch thread back to 
its pool. 

> UIMA AS client needs ShutdownHook to close broker connection
> ------------------------------------------------------------
>
>                 Key: UIMA-2065
>                 URL: https://issues.apache.org/jira/browse/UIMA-2065
>             Project: UIMA
>          Issue Type: Improvement
>          Components: Async Scaleout
>            Reporter: Jerry Cwiklik
>            Assignee: Jerry Cwiklik
>            Priority: Minor
>             Fix For: 2.3.1AS
>
>
> If an application exits without calling stop method on the UIMA AS client, an 
> ugly exception is thrown by the broker:
> java.net.SocketException: Connection reset
>         at java.net.SocketInputStream.read(SocketInputStream.java:168)
>         at 
> org.apache.activemq.transport.tcp.TcpBufferedInputStream.fill(TcpBuff
> eredInputStream.java:50)
>         at 
> org.apache.activemq.transport.tcp.TcpTransport$2.fill(TcpTransport.ja
> va:575)
>         at 
> org.apache.activemq.transport.tcp.TcpBufferedInputStream.read(TcpBuff
> eredInputStream.java:58)
>         at 
> org.apache.activemq.transport.tcp.TcpTransport$2.read(TcpTransport.ja
> va:560)
>         at java.io.DataInputStream.readInt(DataInputStream.java:370)
>         at 
> org.apache.activemq.openwire.OpenWireFormat.unmarshal(OpenWireFormat.
> java:269)
>         at 
> org.apache.activemq.transport.tcp.TcpTransport.readCommand(TcpTranspo
> rt.java:226)
>         at 
> org.apache.activemq.transport.tcp.TcpTransport.doRun(TcpTransport.jav
> a:218)
>         at 
> org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:
> 201)
>         at java.lang.Thread.run(Thread.java:619)
> This exception is thrown by the broker when it realizes that the socket 
> connection to a client closed unexpectedly. Add a Shutdown Hook to the client 
> to enable cleanup even though the application exits without calling stop().

-- 
This message is automatically generated by JIRA.
-
For more information on JIRA, see: http://www.atlassian.com/software/jira


Reply via email to