[英]JMS temporary queue discards first message
我通過命名的 JMS 隊列向 Weblogic 10.3 服務器發送 JMS 請求,並通過臨時隊列接收回復。
客戶端(准系統):
//init
Destination replyQueue = session.createTemporaryQueue();
replyConsumer = session.createConsumer(replyQueue);
...
//loop
TextMessage requestMessage = session.createTextMessage();
requestMessage.setText("Some request")
requestMessage.setJMSReplyTo(replyQueue);
requestProducer.send(requestMessage);
Message msg = replyConsumer.receive(5000);
if (msg instanceof TextMessage) {
...
} else { ... }
//loop end
服務器 MDB(消息驅動 bean):
public void onMessage(Message msg) {
if (msg instanceof TextMessage) {
...
TextMessage replyMessage = jmsSession.createTextMessage();
replyMessage.setText("Some response");
replyMessage.setJMSCorrelationID(msg.getJMSCorrelationID());
replyProducer.send(replyMessage);
}
}
問題是第一個服務器回復經常丟失,也就是說, replyConsumer.receive(5000)
每第 4-5 個 replyConsumer 以超時結束。 當消費者收到第一個答案時,它會繼續收到所有 rest,因此問題僅在於創建臨時隊列后通過臨時隊列發送的第一條消息。
我的問題:我是否必須為臨時隊列設置一些特殊的東西,以便它在創建后從一開始就可以工作? 或者還有什么提示?
更多信息:
replyConsumer.setMessageListener(this)
而不是同步replyConsumer.receive(5000)
) 。 行為沒有改變,臨時隊列的第一條消息仍然丟失。編輯:我正在使用的 Weblogic 服務器(或集群)似乎有問題。 因為當我將服務器應用程序部署到我們擁有的另一個 Weblogic 集群時,一切都開始正常工作了嗎? 兩個集群的配置應該相同——所以區別在哪里。 令我害怕的是 Weblogic 沒有發出錯誤信號。
您的問題似乎是有時服務器正在接收發布並在您的消費者開始接收之前丟棄它。
解決方法是使用異步接收 (replyConsumer.setMessageListener) 調用而不是您當前擁有的阻塞調用 (replyConsumer.receive(5000)),並將調用添加到您的消費者代碼的 rest 代碼中。
這樣,您在發送請求之前就已經在收聽回復。
希望有所幫助。
編輯:剛讀到您正在使用臨時隊列,所以我的第一句話不正確。 但是,作為實驗,請嘗試我的回復中的 rest,看看它是否會改變您所看到的行為
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.