簡體   English   中英

JMS 臨時隊列丟棄第一條消息

[英]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,因此問題僅在於創建臨時隊列后通過臨時隊列發送的第一條消息。

我的問題:我是否必須為臨時隊列設置一些特殊的東西,以便它在創建后從一開始就可以工作? 或者還有什么提示?

更多信息:

  • 在針對我的本地開發機器進行測試時,臨時隊列可以正常工作。 只有在針對我們的集群 Weblogic 服務器進行測試時,消息才會丟失。 但是,我關閉了除一個實例之外的所有集群成員。
  • 我已經驗證服務器成功回復了客戶端發送的所有請求(通過計算發送的請求和發送的回復)。 服務器以毫秒為單位進行回復,即使是丟失的回復也是如此。
  • 當我用常規命名隊列替換臨時隊列時,問題就消失了。 所以問題似乎(對我來說)不在我的代碼中。
  • 我也嘗試過修改回復消息的到期時間、持久性、延遲等,但沒有成功。 這樣我就排除了響應早於客戶端開始讀取隊列,然后消息立即過期而不給客戶端處理它的機會的情況。
  • 編輯:我還嘗試使用異步replyConsumer.setMessageListener(this)而不是同步replyConsumer.receive(5000) ) 。 行為沒有改變,臨時隊列的第一條消息仍然丟失。

編輯:我正在使用的 Weblogic 服務器(或集群)似乎有問題。 因為當我將服務器應用程序部署到我們擁有的另一個 Weblogic 集群時,一切都開始正常工作了嗎? 兩個集群的配置應該相同——所以區別在哪里。 令我害怕的是 Weblogic 沒有發出錯誤信號。

您的問題似乎是有時服務器正在接收發布並在您的消費者開始接收之前丟棄它。

解決方法是使用異步接收 (replyConsumer.setMessageListener) 調用而不是您當前擁有的阻塞調用 (replyConsumer.receive(5000)),並將調用添加到您的消費者代碼的 rest 代碼中。

這樣,您在發送請求之前就已經在收聽回復。

希望有所幫助。

編輯:剛讀到您正在使用臨時隊列,所以我的第一句話不正確。 但是,作為實驗,請嘗試我的回復中的 rest,看看它是否會改變您所看到的行為

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM