javax.jms.InvalidDestinationException:无法使用来自其他连接的临时目标

javax.jms.InvalidDestinationException:无法使用来自其他连接的临时目标,java,jms,activemq,Java,Jms,Activemq,我有一个生产者,它连接到ActiveMQ代理,向客户端发送消息 因为它需要来自客户端的一些响应,所以它首先创建一个临时队列,并将其与JMS replyto头关联 然后,它将消息发送到代理,并等待来自客户端的临时队列响应 通过临时队列接收来自客户端的响应,执行所需操作,然后退出 这在大多数情况下都可以正常工作,但应用程序偶尔会抛出错误消息,表示“无法使用从另一个连接创建的队列” 由于临时队列是从当前会话本身创建的,因此我无法确定是什么原因导致这种情况发生 有没有其他人遇到这种情况并知道如何解决 代

我有一个生产者,它连接到ActiveMQ代理,向客户端发送消息

  • 因为它需要来自客户端的一些响应,所以它首先创建一个临时队列,并将其与JMS replyto头关联
  • 然后,它将消息发送到代理,并等待来自客户端的临时队列响应
  • 通过临时队列接收来自客户端的响应,执行所需操作,然后退出
  • 这在大多数情况下都可以正常工作,但应用程序偶尔会抛出错误消息,表示“无法使用从另一个连接创建的队列”

    由于临时队列是从当前会话本身创建的,因此我无法确定是什么原因导致这种情况发生

    有没有其他人遇到这种情况并知道如何解决

    代码段:

    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
    接口


    我所要做的就是向代理发送一条消息,然后等待客户机通过临时队列做出响应。我还使用池连接工厂来获取连接。

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


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

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


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

    这是代码段:
    connection conn=myJmsTemp。getConnectionFactory().createConnection()
    ses=conn.createSession(事务处理,确认模式)
    responseQueue=ses.createTemporaryQueue()

    MyMessageCreator msgCrtr=新的MyMessageCreator(对象、响应)
    myJmsTemp.send(dest,msgCrtr)
    myJmsTemp.setReceiveTimeout(超时)
    ObjectMessage response=(ObjectMessage)myJmsTemplate.receive(responseQueue)
    MyMessageCreator类实现MessageCreator并实现createmessage方法。你能看出这里面有什么奇怪的地方吗?我真的能读懂这篇未格式化的代码,你能编辑你的原始文章并添加一些代码部分来展示你在做什么吗?蒂姆,我已经在原始文章中添加了格式化的代码片段。我不尝试在任何地方获取新连接或重新初始化连接对象。请注意,制作人在大多数情况下工作正常,但有几次抛出了我们在这里讨论的错误。更新了我的答案,以指出最有可能的原因,假设在向代理发送消息->在临时队列上等待响应->在临时队列上获取响应的整个过程中,将使用相同的连接。如果我错了,请纠正我。那么,在本例中,是否有任何解决方法来消除此错误消息?这是代码段:
    Connection conn=myJmsTemp。getConnectionFactory().createConnection()
    ses=conn.createSession(事务处理,确认模式)
    responseQueue=ses.createTemporaryQueue()

    MyMessageCreator msgCrtr=新的MyMessageCreator(对象、响应)
    myJmsTemp.send(dest,msgCrtr)
    myJmsTemp.setReceiveTimeout(超时)
    ObjectMessage response=(ObjectMessage)myJmsTemplate.receive(responseQueue)
    MyMessageCreator类实现MessageCreator并实现createmessage方法。你能看出这里面有什么奇怪的地方吗?我真的能读懂这篇未格式化的代码,你能编辑你的原始文章并添加一些代码部分来展示你在做什么吗?蒂姆,我已经在原始文章中添加了格式化的代码片段。我不尝试在任何地方获取新连接或重新初始化连接对象。请注意,制作人在大多数情况下工作正常,但有几次抛出了我们在这里讨论的错误。更新了我的答案,以指出最有可能的原因,假设在向代理发送消息->在临时队列上等待响应->在临时队列上获取响应的整个过程中,将使用相同的连接。如果我错了,请纠正我。那么,在这种情况下,有没有解决这个错误的方法?