1

这是WebSphere MQ 和 Atomikos - Messages Lost on process terminate中继续讨论的一个问题

JMS 字段中提到的 JMSDeliveryMode和具有相应 MQMD 字段的属性是否确定 MQ 消息是否持久?

4

1 回答 1

3

是的,只要使用 IBM 的 JMS 类将消息放在那里。这些类会将JMSDeliveryMode值转换为 WebSphere MQ 持久性值之一。

AC 程序可能会尝试设置或更改消息属性,以便它们与消息头不同,我不确定 WMQ API 是否会在这种情况下强制执行一致性。

但是,重申第一部分,答案是肯定的。链接的页面描述了 JMS 属性如何映射到本机 WMQ 标头,JMSDeliveryMode并且确实映射到MQMD.Persistence.

我注意到您指向 V6.0 信息中心的链接。希望您不再使用 WMQ V6.0,因为它会在几天后终止服务。相同信息的当前信息中心主题在这里,您会发现它已重新组织并阐明了一些要点。我强烈建议至少迁移到 V7.1 客户端和 QMgr,最好是 V7.5——当然还有相应的 Infocenter。

更新:
回应评论,优先顺序如下:

  1. 如果在托管对象对象定义中明确设置了持久性,如此处所述则它具有优先权。
  2. 如果托管对象设置为PERSISTENCE=APP(默认),则应用程序的设置优先。
  3. 如果托管对象和应用程序都没有明确设置持久性,那么默认是查看队列上的设置并使用它。

请注意,如果第一次放置消息的队列恰好是传输队列,则持久性在该点确定并随消息一起到达任何位置,即使远程目标队列设置为DEFPSIST(NO).

如果您仔细查看第一个项目符号中链接的页面,您会注意到可能的持久性值 HIGH。该值的描述似乎已从书中删除(我会报告),但它在此页面上. 这是 JMS 的“尽力而为”的交付模式,介于 WMQ 的持久模式和非持久模式之间。由于没有本机等效项,WMQ 通过在标记为恢复的队列上使用非持久消息来实现这一点。当 QMgr 启动时,将保存队列中的所有非持久消息,假设关闭和启动正常且队列文件未损坏。即使在具有线性日志记录的 QMgr 上,也不会记录这些消息以进行媒体恢复,因此它们只有一个副本。因此,大多数情况下,这些消息在重新启动后仍然存在,但如果 QMgr 可以通过删除它们来解决任何情况,它就会解决。

请注意页面上的警告说,必须将消息通过的所有队列设置为NPMCLASS(HIGH)才能正常工作。我不确定如果消息在NPMSPEED(NORMAL)通过网络的途中进入队列时会发生什么,但您可能应该将它们视为非持久性的。

于 2012-09-25T19:18:22.243 回答