We are using ActiveMQ 5.4.2 on CentOS 5.4 and also run into a "message stuck
in a queue" scenario. In our case these stuck messages had no content.
Here's an outline of what was happening:

a) we were seeing a few empty messages submitted to the queue (our fault -
there weren't really supposed to be empty, but because of a producer error
they were)
b) our consumer application (using STOMP) would never get these empty
messages and would wait in perpetuity
c) deleteing these empty messages from the queue and reconnecting the
consumer would resume the flow of messages
d) In ActiveMQ log, we noticed this stack trace: 

2011-01-30 17:12:34,811 | ERROR | Failed to page in more queue messages  |
org.apache.activemq.broker.region.Queue | Queue:test66
java.lang.NullPointerException
        at
org.apache.activemq.transport.stomp.LegacyFrameTranslator.convertMessage(LegacyFrameTranslator.java:90)
        at
org.apache.activemq.transport.stomp.ProtocolConverter.convertMessage(ProtocolConverter.java:610)
        at
org.apache.activemq.transport.stomp.StompSubscription.onMessageDispatch(StompSubscription.java:93)
        at
org.apache.activemq.transport.stomp.ProtocolConverter.onActiveMQCommand(ProtocolConverter.java:592)
        at
org.apache.activemq.transport.stomp.StompTransportFilter.oneway(StompTransportFilter.java:58)
        at
org.apache.activemq.transport.MutexTransport.oneway(MutexTransport.java:40)
        at
org.apache.activemq.broker.TransportConnection.dispatch(TransportConnection.java:1249)
        at
org.apache.activemq.broker.TransportConnection.processDispatch(TransportConnection.java:810)
        at
org.apache.activemq.broker.TransportConnection.dispatchSync(TransportConnection.java:770)
        at
org.apache.activemq.broker.region.PrefetchSubscription.dispatch(PrefetchSubscription.java:649)
        at
org.apache.activemq.broker.region.PrefetchSubscription.dispatchPending(PrefetchSubscription.java:599)
        at
org.apache.activemq.broker.region.PrefetchSubscription.add(PrefetchSubscription.java:156)
        at
org.apache.activemq.broker.region.Queue.doActualDispatch(Queue.java:1798)
        at org.apache.activemq.broker.region.Queue.doDispatch(Queue.java:1745)
        at 
org.apache.activemq.broker.region.Queue.pageInMessages(Queue.java:1898)
        at org.apache.activemq.broker.region.Queue.iterate(Queue.java:1425)
        at
org.apache.activemq.thread.DedicatedTaskRunner.runTask(DedicatedTaskRunner.java:98)
        at
org.apache.activemq.thread.DedicatedTaskRunner$1.run(DedicatedTaskRunner.java:36)


e) Putting a try/catch block around that line in LegacyFrameTranslator.java
(activemq-core/src/main/java/org/apache/activemq/transport/stomp/LegacyFrameTranslator.java:90)
causes the messages to not be stuck any more: they now show up successfully
on the consumer side. Here's the change we did:


90c90,94
<             command.setContent(msg.getText().getBytes("UTF-8"));
---
>             try {
>                 command.setContent(msg.getText().getBytes("UTF-8"));
>             } catch (Throwable e) {
>                 command.setContent(new byte[0]);
>             }


Not sure if this is the "right" way to fix the problem. 
Hoping someone on this list could shed some light.

-- 
View this message in context: 
http://activemq.2283324.n4.nabble.com/Message-stuck-on-queue-tp3076607p3252992.html
Sent from the ActiveMQ - User mailing list archive at Nabble.com.

Reply via email to