JMS - message API setJMSredelivered 和 getJMSredelivered 如何工作?

JMS - How does message API setJMSredelivered and getJMSredelivered work?

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

使用的步骤:

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

  2. 发布消息。

  3. 使用消息。在消息中调用 getJMSRedelivered()

它应该是真的。但它的重新调整是错误的。 我错过了什么吗?

不,您不应该在发布消息时设置 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);

希望对您有所帮助。

setJMSredelivered 由容器管理,如果您将其设置为 true 并发布消息[尚未 'redelivered'],容器会将 setJMSredelivered 设置为 false。

当消息被传递时,例如,发生了致命的事情,容器将回滚调用并将 setJMSredelivered 设置为 true。