2011-08-13 26 views
0

我有一個生產者連接到ActiveMQ代理,向我發送消息給客戶端。javax.jms.InvalidDestinationException:無法使用來自其他連接的臨時目標

  1. 由於它期望從客戶機一些響應,它首先創建臨時隊列和它關聯到JMS的replyTo報頭。
  2. 然後它將消息發送給代理並等待客戶端對臨時隊列的響應。
  3. 接收客戶端對臨時隊列的響應,執行所需操作並退出。

這個工作正常,大多數時候,但零星應用程序拋出錯誤信息說:「不能使用從其他連接創建的隊列」。

我無法確定什麼可能導致這種情況發生,因爲正在從當前會話本身創建臨時隊列。

還有其他人遇到這種情況,並知道如何解決它?

代碼片段:

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

我所要做的就是向代理髮送一條消息,並等待客戶端通過臨時隊列進行響應。另外我正在使用一個連接工廠來獲得連接。

回答

3

如果您有一個客戶端正嘗試作爲使用者訂閱由其他連接實例創建的臨時目標,您會收到類似的錯誤消息。 JMS規範定義了只有創建臨時目標的連接可以從中消耗,所以這就是限制存在的原因。至於你看到它的原因很難說,沒有看到你的代碼遇到錯誤。

鑑於您的更新說明您正在使用Pooled連接工廠,我猜測這是您問題的根源。如果消費調用恰好使用池中的不同連接而不是創建臨時目標的連接,那麼您會看到您提到的錯誤。

+0

這是代碼片段:
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並實現createmessage方法。 你能解釋一些奇怪的東西嗎? – Hari

+0

我真的可以閱讀這個無格式的代碼,你可以編輯你的原始文章,並添加一些代碼部分,以顯示你在做什麼? –

+0

Tim,我已將格式化的代碼片段添加到原始帖子中。我不試圖獲得新的連接或重新初始化連接對象。請注意,製作人在大多數時間都能正常工作,但很少有人會拋出我們在此討論的錯誤。 – Hari

相關問題