JMS - 消息API setJMSredelivered和getJMSredelivered如何工作?

时间:2015-04-17 07:18:56

标签: java jms

我正在尝试了解这两个API:setJMSRedeliveredgetJMSRedelivered用于我的项目。 链接:http://docs.oracle.com/javaee/5/api/javax/jms/Message.html#getJMSRedelivered()

使用的步骤:

  1. 在我们想要发布主题的消息上调用setJMSRedelivered(true)

  2. 发布消息。

  3. 消费此消息。在消息上拨打getJMSRedelivered()

  4. 它应该收到真实的。但它的重新调整是假的。 我错过了什么吗?

2 个答案:

答案 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。