[
https://issues.apache.org/jira/browse/AMQ-6155?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15152610#comment-15152610
]
Kevin Bowman commented on AMQ-6155:
-----------------------------------
That's a fairly damning log sequence. But because there appear to be two
threads involved, the order in which things are logged are not necessarily the
order in which they occurred. The first two lines have the same exact
timestamp but different threads, so the order in which they are logged is more
up to chance than anything else.
Still, I think the fact that you're able to see the issue without the "unusual"
application structure I was using is a good enough reason to reopen this.
However, I suspect the answer will be the same; to just disable
watchTopicAdvisories. I'm currently recommending to everyone who uses temp
queues with ActiveMQ to add 'jms.watchTopicAdvisories=false' to their URL.
> 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.10.2, 5.13.0
> Environment: Windows, OS X
> Reporter: Kevin Bowman
> Attachments: AmqTempRaceConditionMinimalTest.java
>
>
> 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)