javax.jms.InvalidDestinationException:无法使用另一个Connection的临时目标

时间:2011-08-13 10:09:56

标签: java jms activemq

我有一个连接到ActiveMQ代理的生产者向我发送消息给客户。

  1. 由于它需要客户端的一些响应,它首先创建一个临时队列并将其与 JMS replyto 标头相关联。
  2. 然后将消息发送给代理,并等待客户端对临时队列的响应。
  3. 通过临时队列接收客户端的响应,执行所需的操作然后退出。
  4. 这在大多数时候都可以正常工作,但偶尔应用程序会抛出错误消息“不能使用从另一个连接创建的队列”。

    由于正在从当前会话本身创建临时队列,我无法确定可能导致这种情况发生的原因。

    是否有其他人遇到过这种情况并知道如何解决这个问题?

    代码段:

    Connection conn = myJmsTemp. getConnectionFactory().createConnection();
    ses = conn.createSession(transacted,ackMode);
    responseQueue = ses.createTemporaryQueue();
    ...
    MyMessageCreator msgCrtr = new MyMessageCreator(objects,responseQueue);
    myJmsTemp.send(dest, msgCrtr);
    myJmsTemp.setReceiveTimeout(timeout);
    ObjectMessage response = (ObjectMessage)myJmsTemplate.receive(responseQueue);
    

    此处MyMessageCreator实现MessageCreator接口。

    所有我想做的就是向代理发送消息并等待客户端通过临时队列的响应。我还使用池连接工厂来获得连接。

1 个答案:

答案 0 :(得分:3)

如果您的客户端尝试在由其他连接实例创建的临时目标上订阅为使用者,则会收到类似这样的错误。 JMS规范定义只有创建临时目标的连接才能从中消耗,因此存在限制的原因。至于你看到它的原因很难说没有看到遇到错误的代码。

鉴于您的更新说明您正在使用Pooled连接工厂,我猜这是您问题的根源。如果消耗调用恰好使用与池不同的连接而不是创建临时目标的连接,那么您将看到您提到的错误。