克隆和共享的预订
在 IBM® MQ 8.0 或更高版本中,有两种方法用于授予多个使用者对同一预订的访问权。 这两种方法是:使用克隆的预订或使用共享的预订。
克隆的预订
克隆的预订是 IBM MQ 扩展。 克隆的预订支持不同 Java 虚拟机 (JVM) 中的多个使用者对预订进行并发访问。 可以通过在 ConnectionFactory 对象上将 CLONESUPP 属性设置为 Enabled 来使用此行为。 缺省情况下,CLONESUPP 为 Disabled。 只可以在持久预订上启用克隆的预订。 如果启用 CLONESUPP,那么使用该 connectionFactory 建立的每个后续连接都将被克隆。
如果创建了一个或多个使用者以从某个持久预订处接收消息(即,创建时指定了同一个预订名称),那么可以将该预订视为克隆的预订。 只有创建使用者时所使用的连接在 MQConnectionFactory 上将 CLONESUPP 设置为 Enabled,才可以这样做。 在预订的主题上发布消息时,会将该消息的副本发送至预订。 消息对所有使用者都可用,但只有一个使用者会收到该消息。
注: 启用克隆的预订将扩展 JMS 规范。
共享的预订
JMS 2.0 规范引入的共享预订允许在多个使用者之间共享来自主题预订的消息。 只会将来自预订的每条消息发送给该预订上的一个使用者。 共享预订由对 JMS 2.0 或更高版本 API 的相关调用启用。
可以采用以下方法之一来调用 API:
- 从 Java SE 应用程序 (或 Java EE 客户机容器)。
- 通过 servlet 或 MDB 的实现。
如果启用共享的预订,那么将无法取消共享。
可以将共享的预订创建为持久预订或非持久预订。 不需要在正常 JMS 配置之外的队列管理器端单独创建任何对象。 将动态创建所需的任何对象。
决定使用共享的预订还是克隆的预订
在决定是使用共享预订还是克隆预订时,请考虑这两者的优点。 如果可能,请使用共享预订,因为它是规范定义的行为,而不是特定于 IBM MQ 的扩展。
下表包含一些在决定使用共享的预订还是克隆的预订时需考虑的要点:
| 共享的预订 | 克隆的预订 |
|---|---|
| 共享预订是 JMS 2.0 或更高版本规范的标准部分。 | 克隆的预订是特定于 IBM MQ 的扩展。 |
| 通过使用显式 API 方法调用来创建共享的预订。 | 在 ConnectionFactory 级别以管理方式控制克隆的预订。 |
| 共享的预订可以是持久预订也可以是非持久预订。 | 克隆的预订只可以是持久预订。 |
| 共享的预订以单个预订为基础显式创建。 | 克隆的预订在启用了功能的连接下用于任何持久预订。 |
| 如果将预订创建为共享预订,那么稍后无法将其更改为非共享,反之亦然。 | 如果所拥有连接的 CLONESUPP 属性已更改,那么每次重新打开预订时可以将其从克隆更改为非克隆。 |