慕尼黑5688855
2022-06-08 17:38:48
我測試了一個將 a 傳遞給 IBM MQ 上的隊列的獨立 JMS 客戶端TextMessage,我得到了以下錯誤消息 ID:編號:414d51204243573032413154202020205bc6bd3e25423865java.lang.RuntimeException:沒有短信我發送了一個TextMessagewith This is for Test,但為什么我沒有收到一個TextMessage?在此代碼運行之前,隊列中沒有其他消息。如果短信成功,如何在 Java 中以可讀格式讀取消息 ID(發送請求 MessageID 和回復消息 ID)。我需要在下面的代碼中更改什么嗎?TextMessage textMessage = queueSession.createTextMessage("This is for Test");textMessage.setJMSReplyTo(queue);textMessage.setJMSType("mcd://xmlns");//message typetextMessage.setJMSExpiration(2*1000);//message expirationtextMessage.setJMSDeliveryMode(DeliveryMode.PERSISTENT); queueSender = queueSession.createSender(queueSession.createQueue(outputQName));queueSender.setTimeToLive(2*1000);queueSender.send(textMessage);String jmsCorrelationID = " JMSCorrelationID = '" + textMessage.getJMSMessageID() + "'";while (true) { Message message = queueReceiver.receive(60*1000); if (! (message instanceof TextMessage)) throw new RuntimeException("no text message"); TextMessage tm = (TextMessage) message; System.out.println("Message:"+tm.getText()); }
3 回答

aluckdog
TA貢獻1847條經驗 獲得超7個贊
這可能僅僅是因為您的消息正在從隊列中過期嗎?
我看到您將消息到期時間設置為 2 秒。許多回復應用程序會將剩余的到期值復制到回復消息中。因此,如果讀取請求并向您發送回復的應用程序在發送請求后的 2 秒內未讀取您的請求,或者如果它讀取請求并回復剩余的到期時間,并且回復不會使其返回以供使用你,它會從隊列中消失。
嘗試將到期時間增加到更高的值。
另請注意,您通過兩種不同的方法設置相同的到期值,一種是生產者發送的所有消息的默認值,另一種是每條消息的設置。
這會為生產者發送的所有消息設置默認過期時間:
queueSender.setTimeToLive(2*1000);
這會在您發送的特定消息上設置到期時間,并將覆蓋queueSender.setTimeToLive
,因此您只需要這些行之一。
textMessage.setJMSExpiration(2*1000);//message expiration

慕沐林林
TA貢獻2016條經驗 獲得超9個贊
您的會話是事務性的嗎?
如果是,那么您的消息在隊列中是“不可見的”,直到事務“提交”并且您永遠不會commit
......
我很想知道message
當你測試它的類時的內容是什么......它是否為空?
是receive
立即返回還是僅在超時到期后返回(在您的情況下為 60 * 1000 毫秒)?
丹尼斯
添加回答
舉報
0/150
提交
取消