Queue 对象或 Topic 对象的 PERSISTENCE 属性可具有 HIGH 值。可使用 WebSphere MQ JMS 管理工具来设置此值,或者,应用程序可调用将 JMSC.MQJMS_PER_NPHIGH 值作为参数传递的 Destination.setPersistence() 方法。
如果应用程序将 JMS 持久消息或 JMS 非持久消息发送到其 PERSISTENCE 属性的值为 HIGH 的目标,并且底层的 WebSphere MQ 队列被设为 NPMCLASS(HIGH),那么此消息将作为 WebSphere MQ 非持久消息放入队列。如果目标的 PERSISTENCE 属性不具有 HIGH 值,或者,如果底层的队列被设为 NPMCLASS(NORMAL),那么 JMS 持久消息将作为 WebSphere MQ 持久消息放入队列,而 JMS 非持久消息将作为 WebSphere MQ 非持久消息放入队列。
如果 JMS 持久消息作为 WebSphere MQ 非持久消息放入队列,并且您想确保在队列管理器停顿关闭或立即关闭之后不废弃此消息,那么此消息可能经由传递的所有队列都必须设为 NPMCLASS(HIGH)。在发布/预订域中,这些队列包括预订程序队列。如果应用程序尝试为其 PERSISTENCE 属性的值为 HIGH 的目标创建消息使用者,并且底层的 WebSphere MQ 队列被设为 NPMCLASS(NORMAL),那么为了帮助强制执行此配置,WebSphere MQ classes for JMS 将抛出 InvalidDestinationException。
将目标的 PERSISTENCE 属性设为 HIGH 不会影响从该目标接收消息的方法。作为 JMS 持久消息发送的消息会作为 JMS 持久消息来接收,作为 JMS 非持久消息发送的消息会作为 JMS 非持久消息来接收。
当应用程序将第一条消息发送到其 PERSISTENCE 属性的值为 HIGH 的目标时,或者,当应用程序为其 PERSISTENCE 属性的值为 HIGH 的目标创建第一个消息使用者时,WebSphere MQ classes for JMS 发出 MQINQ 调用以确定是否在底层的 WebSphere MQ 队列上设置了 NPMCLASS(HIGH)。因此,此应用程序必须有权限在此队列上进行查询。此外,WebSphere MQ classes for JMS 会保留此 MQINQ 调用的结果,直到删除此目标为止,并且此客户机不会再发出 MQINQ 调用。因此,当应用程序仍在使用此目标时,如果您更改底层队列上的 NPMCLASS 设置,那么 WebSphere MQ classes for JMS 不会注意到此新设置。
通过允许将 JMS 持久消息作为 WebSphere MQ 非持久消息放入 WebSphere MQ 队列,可提高性能,但会在某种程度上降低可靠性。如果您需要 JMS 持久消息的最大可靠性,那么不要将消息发送到其 PERSISTENCE 属性的值为 HIGH 的目标。