Improperly closed connections preventing message redelivery
-----------------------------------------------------------

                 Key: AMQ-1376
                 URL: https://issues.apache.org/activemq/browse/AMQ-1376
             Project: ActiveMQ
          Issue Type: Bug
          Components: Transport
    Affects Versions: 5.0.0
            Reporter: Jacob Burkhart


This is a reproducible case of a DEAD Consumer that never gets cleaned up.

I am using telnet to manually test STOMP message consumption.

First I put a message into the queue

I then connect and subscribe to that queue and get the message:

CONNECT
login: test
passcode: test

^@
CONNECTED
session:ID:jacob-64807-1188509209664-4:3


SUBSCRIBE
destination: /queue/Prescriptions
ack: client

^@


This works and I receive the queued messages.
They remain in the Q because I am not send ACK

If I use the DISCONNECT command. I am properly disconnected and I can repeat 
this process to get the same message again. Good.

If I disconnect by killing the telnet process I see the following stack trace 
in MQ. AND I can still repeat the same process of re-retrieving the 
un-acknowledged messages:
        DEBUG Transport                      - Transport failed: 
java.io.EOFException
        java.io.EOFException
                at java.io.DataInputStream.readByte(DataInputStream.java:243)
                at 
org.apache.activemq.transport.stomp.StompWireFormat.readLine(StompWireFormat.java:186)
                at 
org.apache.activemq.transport.stomp.StompWireFormat.unmarshal(StompWireFormat.java:94)
                at 
org.apache.activemq.transport.tcp.TcpTransport.readCommand(TcpTransport.java:196)
                at 
org.apache.activemq.transport.tcp.TcpTransport.doRun(TcpTransport.java:188)
                at 
org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:176)
                at java.lang.Thread.run(Thread.java:613)
        DEBUG TransportConnection            - Stopping connection: 
/XXXXXXXXXXXXXX:4880
        DEBUG TcpTransport                   - Stopping transport 
tcp:///XXXXXXXXXXXXXX:4880
        DEBUG TransportConnection            - Stopped connection: 
/XXXXXXXXXXXXXX:4880
        DEBUG TransportConnection            - Cleaning up connection 
resources: /XXXXXXXXXXXXXX:4880
        DEBUG AMQPersistenceAdapter          - Checkpoint started.
        DEBUG AMQPersistenceAdapter          - Checkpoint done.

HOWEVER,
If I disconnect by repeatedly typing Control-C to close the telnet program I 
see the following stack trace:
        DEBUG Transport                      - Transport failed: 
org.apache.activemq.transport.stomp.ProtocolException: Unable to parser header 
line [????????????]
        org.apache.activemq.transport.stomp.ProtocolException: Unable to parser 
header line [????????????]
                at 
org.apache.activemq.transport.stomp.StompWireFormat.unmarshal(StompWireFormat.java:121)
                at 
org.apache.activemq.transport.tcp.TcpTransport.readCommand(TcpTransport.java:196)
                at 
org.apache.activemq.transport.tcp.TcpTransport.doRun(TcpTransport.java:188)
                at 
org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:176)
                at java.lang.Thread.run(Thread.java:613)
        DEBUG TransportConnection            - Stopping connection: 
/XXXXXXXXXXXXXX:64820
        DEBUG TcpTransport                   - Stopping transport 
tcp:///XXXXXXXXXXXXXX:64820
        DEBUG AMQPersistenceAdapter          - Checkpoint started.
        DEBUG AMQPersistenceAdapter          - Checkpoint done.

AND, I am no longer able to retrieve the queued up messages.  Looking at the 
admin console I see  Number Of Consumers  = 1, leading me to believe that 
ActiveMQ didn't properly handle the disconnection.  In the other 2 cases 
(DISCONNECT and kill) the "Number Of Consumers" drops to zero on connection 
termination.

I believe the correct behavior should be to properly handle and clean-up the 
connection on bad data.  Or perhaps periodically check each of the supposed 
"Consumers" to make sure that they are still alive.  This is clearly a 
reproducible case of a DEAD Consumer that never gets cleaned up.

Comparing the DEBUG output the follows the 2 stack traces, it is clear in the 
second case that ActiveMQ fails to clean up the connections resources for the 
unexpectedly disconnected consumer.



-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to