MQ JMS 消息 ID returns 无文本消息以及如何以正确的格式编写 MQ JMSCorrelationID
MQ JMS Message ID returns no text message and how to write the MQ JMSCorrelationID in proper format
我测试了一个独立的 JMS 客户端,将 TextMessage
传递给 IBM MQ 上的队列,我得到了以下错误消息 ID:
ID:414d51204243573032413154202020205bc6bd3e25423865
java.lang.RuntimeException: no text message
- 我用
This is for Test
发送了 TextMessage
,但为什么我没有收到 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());
}
在您的请求-回复用例中,请求 客户端发送的消息类型与其将接收的消息类型没有直接关系。请求客户端收到的消息类型取决于 响应 客户端发送的内容。
关于从 IBM MQ 实现中获取 String
消息 ID,您可以参考 。
这可能只是因为队列中的消息即将过期?
我看到您将消息有效期设置为 2 秒。许多回复应用程序会将剩余的到期值复制到回复消息中。因此,如果读取请求并向您发送回复的应用程序在请求发送后的 2 秒内未读取您的请求,或者如果它读取并回复了剩余的到期时间并且回复不会使其返回以供使用你,它会从队列中消失。
尝试将到期时间增加到一个更高的值。
另请注意,您通过两种不同的方法设置相同的到期值,一种是生产者发送的所有消息的默认值,另一种是每条消息设置。
这为生产者发送的所有消息设置了默认到期时间:
queueSender.setTimeToLive(2*1000);
这会设置您发送的特定消息的到期时间,并且会覆盖 queueSender.setTimeToLive
,因此您只需要其中一行。
textMessage.setJMSExpiration(2*1000);//message expiration
您的会话是事务性的吗?
如果是,那么您的消息不会 "visible" 在队列中,直到交易 "commit" 并且您永远不会 commit
...
当你测试它的 class 时,我很想知道 message
的内容是什么。它是否为空?
receive
return 是立即还是仅在超时到期后(在您的情况下为 60*1000 毫秒)?
丹尼斯
我测试了一个独立的 JMS 客户端,将 TextMessage
传递给 IBM MQ 上的队列,我得到了以下错误消息 ID:
ID:414d51204243573032413154202020205bc6bd3e25423865
java.lang.RuntimeException: no text message
- 我用
This is for Test
发送了TextMessage
,但为什么我没有收到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());
}
在您的请求-回复用例中,请求 客户端发送的消息类型与其将接收的消息类型没有直接关系。请求客户端收到的消息类型取决于 响应 客户端发送的内容。
关于从 IBM MQ 实现中获取 String
消息 ID,您可以参考
这可能只是因为队列中的消息即将过期?
我看到您将消息有效期设置为 2 秒。许多回复应用程序会将剩余的到期值复制到回复消息中。因此,如果读取请求并向您发送回复的应用程序在请求发送后的 2 秒内未读取您的请求,或者如果它读取并回复了剩余的到期时间并且回复不会使其返回以供使用你,它会从队列中消失。
尝试将到期时间增加到一个更高的值。
另请注意,您通过两种不同的方法设置相同的到期值,一种是生产者发送的所有消息的默认值,另一种是每条消息设置。
这为生产者发送的所有消息设置了默认到期时间:
queueSender.setTimeToLive(2*1000);
这会设置您发送的特定消息的到期时间,并且会覆盖 queueSender.setTimeToLive
,因此您只需要其中一行。
textMessage.setJMSExpiration(2*1000);//message expiration
您的会话是事务性的吗?
如果是,那么您的消息不会 "visible" 在队列中,直到交易 "commit" 并且您永远不会 commit
...
当你测试它的 class 时,我很想知道 message
的内容是什么。它是否为空?
receive
return 是立即还是仅在超时到期后(在您的情况下为 60*1000 毫秒)?
丹尼斯