MQ JMS 消息 ID 不返回文本消息以及如何以正确格式编写

我测试了一个将 a 传递给 IBM MQ 上的队列的独立 JMS 客户端TextMessage,我得到了以下错误消息 ID:


编号:414d51204243573032413154202020205bc6bd3e25423865


java.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 type

textMessage.setJMSExpiration(2*1000);//message expiration

textMessage.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());  

}


慕尼黑5688855
浏览 208回答 3
3回答

aluckdog

这可能仅仅是因为您的消息正在从队列中过期吗?我看到您将消息到期时间设置为 2 秒。许多回复应用程序会将剩余的到期值复制到回复消息中。因此,如果读取请求并向您发送回复的应用程序在发送请求后的 2 秒内未读取您的请求,或者如果它读取请求并回复剩余的到期时间,并且回复不会使其返回以供使用你,它会从队列中消失。尝试将到期时间增加到更高的值。另请注意,您通过两种不同的方法设置相同的到期值,一种是生产者发送的所有消息的默认值,另一种是每条消息的设置。这会为生产者发送的所有消息设置默认过期时间:queueSender.setTimeToLive(2*1000);这会在您发送的特定消息上设置到期时间,并将覆盖queueSender.setTimeToLive,因此您只需要这些行之一。textMessage.setJMSExpiration(2*1000);//message expiration

慕沐林林

您的会话是事务性的吗?如果是,那么您的消息在队列中是“不可见的”,直到事务“提交”并且您永远不会commit......我很想知道message当你测试它的类时的内容是什么......它是否为空?是receive立即返回还是仅在超时到期后返回(在您的情况下为 60 * 1000 毫秒)?丹尼斯

ABOUTYOU

在您的请求-回复用例中,请求客户端发送的消息类型与其将接收的消息类型没有直接关系。请求客户端接收的消息类型取决于响应客户端发送的消息。至于String从 IBM MQ 实现中获取消息 ID,您可以参考这个答案。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java