在内存中ActiveMQ在完全创建之前尝试响应临时队列?

时间:2011-09-23 20:40:15

标签: java jms activemq

我们需要通过内存activemq代理发送同步消息。我们的同步客户端代码如下所示:

Session responseSession = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
TemporaryQueue responseQ = responseSession.createTemporaryQueue();
msg.setJMSReplyTo(responseQ);
QueueReceiver qReceiver = ((QueueSession) responseSession).createReceiver(responseQ);
sendMessage(msg, false, timeout);
Message response = qReceiver.receive(timeout);

大多数情况下,我们的服务器响应代码工作正常,但有时我们会得到类似的堆栈跟踪:

javax.jms.InvalidDestinationException: Cannot publish to a deleted Destination: temp-queue://ID:<removed>
at org.apache.activemq.ActiveMQSession.send(ActiveMQSession.java:1632)
at org.apache.activemq.ActiveMQMessageProducer.send(ActiveMQMessageProducer.java:231)
at org.apache.activemq.ActiveMQMessageProducerSupport.send(ActiveMQMessageProducerSupport.java:269)

我怀疑根本问题是临时队列未完全设置或者尚未发布,或者在服务尝试向其发布消息时它是什么。在我的服务器代码中,我将循环中的send调用包装在InvalidDestinationException中,暂停一秒钟并再次尝试直到成功。自从我添加了这个,每当我在第二次尝试时看到异常就可以了。

我做错了吗?在将消息发送到服务器之前,我是否应该在客户端上执行同步或刷新或以其他方式确保临时队列已启动?我还应该在服务器端做些什么来确保队列正常运行吗?如果它认为它不存在,我是否可以安全地尝试在服务器端创建临时队列?

注意:我们使用的是ActiveMQ 5.3.0,但今天我尝试使用相同的结果5.5.0。

1 个答案:

答案 0 :(得分:0)

这很奇怪,我不认为它应该发生,因为临时目的地是在本地创建的,应该在临时目的地的Connections映射中。如果您可以创建一个简单的JUnit测试用例,则演示该问题,您应该打开一个新的Jira并将其附加以供审阅。