Kevin Bowman created AMQ-6155:
---------------------------------
Summary: Spurious InvalidDestinationException publishing to a temp
queue from a new connection
Key: AMQ-6155
URL: https://issues.apache.org/jira/browse/AMQ-6155
Project: ActiveMQ
Issue Type: Bug
Components: JMS client
Affects Versions: 5.13.0, 5.10.2
Environment: Windows, OS X
Reporter: Kevin Bowman
When a new connection is opened for the purpose of sending a message to a
temporary queue it sometimes fails with the following exception (stack trace is
from v5.13.0):
javax.jms.InvalidDestinationException: Cannot publish to a deleted
Destination: temp-queue://ID:Potomac.local-59943-1454448412194-1:1:96
at org.apache.activemq.ActiveMQSession.send(ActiveMQSession.java:1904)
at
org.apache.activemq.ActiveMQMessageProducer.send(ActiveMQMessageProducer.java:288)
at
org.apache.activemq.ActiveMQMessageProducer.send(ActiveMQMessageProducer.java:223)
at
org.apache.activemq.ActiveMQMessageProducerSupport.send(ActiveMQMessageProducerSupport.java:241)
The actual problem appears to be in ActiveMQConnection.isDeleted(). Because
the connection being used to send to the temp queue is not the connection under
which the temp queue was created, it's dependent on AdvisoryConsumer to
populate the activeTempDestinations map before the send() call is made. The
AdvisoryConsumer gets called in a separate thread, asynchronous with the main
thread, so this constitutes a race condition. If the send() call is made
before AdvisoryConsumer can notify the new connection of all existing temp
queues then it will throw an InvalidDestinationException even though the temp
queue does actually exist.
Calling setWatchTopicAdvisories(false) on the sending connection's factory
alleviates the problem and the program can run indefinitely with no errors.
Also, adding a delay before the MessageProducer.send() call can alleviate the
error somewhat, but with a small enough delay it will still happen eventually.
I noticed this first in an environment I don't have full control over. It
happened the first time, every time, for reasons I still don't quite
understand. I have written a small test program that reproduces the error
outside of the original environment, but it runs in a loop and it takes a few
hundred iterations for it to occur.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)