我测试了一个将 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
提交
取消