JMS MessageProducer.setTimeToLive()与TextMessage.setJMSExpiration()

Kir*_*rby 4 java jms

呼叫MessageProducer.setTimeToLive()TextMessage.setJMSExpiration()?之间有区别吗?

我可以从文档中看到javax.jms.MessageProducer.setTimeToLive()表示它

设置消息系统应保留生成的消息的发送时间的默认时间长度(以毫秒为单位).

并且javax.jms.Message.setJMSExpiration()表示它

设置邮件的到期值.

那听起来和我一样.我应该继续将两者设置为相同的值吗?

hel*_*cha 8

您不应为Message(或TextMessage,如您的示例中)设置过期设置.来自Java EE 5 Javadocs的文本令人困惑,并且在最近的版本中得到了改进:

此方法仅供JMS提供程序在发送消息时设置此字段.客户端无法使用此消息来配置消息的到期时间.此方法是公共的,允许JMS提供程序在发送其实现不是自己的消息时设置此字段.

这意味着您不应该使用Message#setJMSExpiration()设置邮件过期,因为提供程序将在发送邮件时覆盖该值.

您应该使用它MessageProducer来设置所有消息的超时,MessageProducer#setTimeToLive()或者,如果您只想设置特定消息的到期时间,请使用MessageProducer#send(Message, int, int, long)Shashi的答案中所示.仅在这种情况下,"按消息"设置才会覆盖MessageProducer设置.


Sha*_*shi 2

有一个关键的区别,MessageProducer.setTimeToLive()即为该生产者发送的所有消息设置相同的消息到期时间。另一方面,TextMessage.setJMSExpiration()根据每条消息设置消息到期时间。每条消息上设置的到期时间将覆盖在 上设置的到期时间MessageProducer

JMS还指定了一种在调用方法时设置消息过期时间的方法MessageProducer.send

void send(Message message, int deliveryMode,int priority, long timeToLive)
Run Code Online (Sandbox Code Playgroud)

您可以在 或 上设置消息过期MessageProducer时间TextMessage。无需两者都设置。

  • @Kirby实际上,如果您尝试使用 Message#setJMSExpiration() 设置过期时间,它将不起作用,因为提供程序将始终覆盖它。只能通过 MessageProducer 设置过期时间,可以使用 MessageProducer#setTimeToLive() 为所有消息设置过期时间,也可以使用 MessageProducer#send(Message, int, int, long) 设置每个消息的过期时间。不幸的是,Java EE 5 Javadocs 对此并不清楚。 (4认同)