You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@activemq.apache.org by "Timothy Bish (JIRA)" <ji...@apache.org> on 2016/02/03 20:01:40 UTC

[jira] [Commented] (AMQ-6155) Spurious InvalidDestinationException publishing to a temp queue from a new connection

    [ https://issues.apache.org/jira/browse/AMQ-6155?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15130898#comment-15130898 ] 

Timothy Bish commented on AMQ-6155:
-----------------------------------

This is expected behaviour given the way the test is structured.  The test creates a temp queue on one connection and then uses it on a newly created connection which is not how this work normally work in practice.  Normally the temp queue would arrive in the reply to of an incoming message (request / response pattern) in which case the advisory for creation of that temp queue would have already been dispatched to the remote consumer so it wouldn't see this problem.  The solution to the problem is just what you have done, turn off watchTopicAdvisories in the connection factory.  

> 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)