MQ JMS 消息标识不返回任何文本消息以及如何以正确的格式编写 MQ JMSCorrelationID



我测试了一个独立的 JMS 客户端,将TextMessage传递到 IBM MQ 上的队列,结果收到以下消息 ID 并显示错误:

ID:414d51204243573032413154202020205bc6bd3e25423865

java.lang.RuntimeException: no text message

  1. 我发送了This is for Test TextMessage,但为什么没有收到TextMessage?在此代码运行之前,队列中没有其他消息。
  2. 如果文本消息成功,如何在Java中以可读格式读取消息ID(发送请求消息ID和回复消息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());  
}

这可能只是您的消息从队列中过期吗?

我看到您将消息过期设置为 2 秒。 许多回复应用程序会将剩余的到期值复制到回复消息中。 因此,如果读取请求并向您发送回复的应用程序在发送请求后的 2 秒内未读取您的请求,或者如果它读取了请求并回复了剩余到期时间,并且回复没有返回供你使用,它将从队列中消失。

尝试将到期时间增加到更高的值。


另请注意,您通过两种不同的方法设置相同的到期值,一种是生产者发送的所有消息的默认值,另一种是每条消息的设置。

这会为生产者发送的所有消息设置默认过期时间:

queueSender.setTimeToLive(2*1000);

这将设置您正在发送的特定消息的到期时间,并将覆盖queueSender.setTimeToLive,因此您只需要其中一行。

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

在您的请求-回复用例中,请求客户端发送的消息类型与它将接收的消息类型没有直接关系。请求客户端接收的消息类型取决于响应客户端发送的内容。

至于从 IBM MQ 实现中获取消息标识作为String,您可以参考此答案。

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

最新更新