我测试了一个独立的JMS客户端,该客户端将TextMessage
传递到IBM MQ上的队列,并且得到以下带有错误的消息ID:
ID:414d51204243573032413154202020205bc6bd3e25423865
java.lang.RuntimeException:没有文本消息
TextMessage
发送了This is for Test
,但是为什么没有收到TextMessage
?在运行此代码之前,队列中没有其他消息。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());
}
答案 0 :(得分:0)
在您的请求-答复用例中,请求客户端发送的消息类型与它将接收的消息类型没有直接关系。请求客户端收到的消息类型取决于响应客户端发送的内容。
关于从IBM MQ实现中以String
的形式获得消息ID,可以参考this answer。
答案 1 :(得分:0)
这仅仅是因为您的消息即将从队列中过期吗?
我看到您将邮件过期设置为2秒。许多答复应用程序会将剩余的到期值复制到答复消息中。因此,如果读取请求并向您发送回复的应用程序在发送请求后的2秒钟内未读取您的请求,或者该应用程序在剩余的有效期限内进行了回复并没有将其退还给您,它将从队列中消失。
尝试将到期时间增加到更高的值。
还请注意,您通过两种不同的方法来设置相同的有效期值,一种是生产者发送的所有消息的默认值,另一种是针对每条消息的设置。
这将设置生产者发送的所有消息的默认到期时间:
queueSender.setTimeToLive(2*1000);
这将设置您要发送的特定邮件的有效期限,并且将覆盖queueSender.setTimeToLive
,因此您只需要其中一行。
textMessage.setJMSExpiration(2*1000);//message expiration
答案 2 :(得分:0)
您的会话是否具有事务性?
如果是,则在事务“提交”之前,您的消息在队列中是“不可见的”,并且您永远不会commit
...
我很好奇message
在测试其类时的内容。它为空吗?
receive
是立即返回还是仅在超时到期后返回(在您的情况下为60 * 1000ms)?
丹尼斯