我正在尝试了解这两个API:setJMSRedelivered
和getJMSRedelivered
用于我的项目。
链接:http://docs.oracle.com/javaee/5/api/javax/jms/Message.html#getJMSRedelivered()
使用的步骤:
在我们想要发布主题的消息上调用setJMSRedelivered(true)
。
发布消息。
消费此消息。在消息上拨打getJMSRedelivered()
。
它应该收到真实的。但它的重新调整是假的。 我错过了什么吗?
答案 0 :(得分:3)
不,您不应该在发布消息时设置JMSRedelivered
属性。消息传递提供程序在多次传递消息时将设置此属性。
根据JMS规范
如果客户端收到带有JMSRedelivered指标集的消息,则可能(但不能保证)此消息已传递但过去未得到确认。通常,提供程序必须在重新传递消息时设置消息的JMSRedelivered消息头字段。如果该字段设置为true,则表明消费应用程序过去可能已传递该消息,并且应用程序应采取额外的预防措施以防止重复处理。
此标题字段在发送时没有任何意义,并且未被分配 发送方法。
仔细阅读最后一行,它说JMSRedelivered
在发送邮件时有no
含义。
在您的情况下,由于邮件已重新传递 ,因此getJMSRedelivered
属性调用将返回FALSE
。
<强>更新强>
测试JMSRedelivered
属性的示例代码。
// Create JMS objects
connection = cf.createConnection();
System.out.println("Created connection to " + queueManager);
// Create a transacted session.
session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
System.out.println("Session created");
Destination topicScore = session.createTopic("/SCORE");
MessageConsumer consScore = session.createConsumer(topicScore );
JMSBytesMessage msg=null;
// Receive message first
msg = (JMSBytesMessage) colesConsumer.receiveNoWait();
System.out.println(msg.getJMSRedelivered);
// Rollback the previous receive, to force messaging provider to redeliver the message
session.rollback();
// receive message again
msg = (JMSBytesMessage) colesConsumer.receiveNoWait();
// This time JMSRedelivered will be true.
System.out.println(msg.getJMSRedelivered);
希望这对你有所帮助。
答案 1 :(得分:0)
setJMSredelivered由容器管理,如果您将其设置为true并发布消息[尚未重新传送&#39;]容器将setJMSredelivered设置为false。
当传递消息时,例如,发生致命事件时,容器将回滚调用并将setJMSredelivered设置为true。