MQOPEN 和集群
打开集群队列时,要将消息放置到的队列或者要从中读取消息的队列取决于 MQOPEN 调用。
选择目标队列
如果在对象描述符 MQOD 中不提供队列管理器名称,那么队列管理器会选择要将消息发送到的队列管理器。 如果在对象描述符中提供队列管理器名称,那么始终将消息发送到所选队列管理器。
如果队列管理器要选择目标队列管理器,那么选择取决于绑定选项 MQOO_BIND_*,以及本地队列是否存在。 如果存在队列的本地实例,那么始终会优先于远程实例打开此本地实例,除非 CLWLUSEQ 属性设置为 ANY。 否则,选择取决于绑定选项。 将 消息组 与集群配合使用时,必须指定 MQOO_BIND_ON_OPEN 或 MQOO_BIND_ON_GROUP ,以确保在同一目标处处理组中的所有消息。
如果队列管理器正在选择目标队列管理器,那么它将使用工作负载管理算法以循环方式执行此操作; 请参阅 集群中的工作负载均衡。
使用工作负载均衡算法的时机取决于打开集群队列的方式:
MQOO_BIND_ON_OPEN- 应用程序打开集群时使用此算法。MQOO_BIND_NOT_FIXED- 将每条消息放入队列时使用此算法。MQOO_BIND_ON_GROUP- 在每个消息组开头使用此算法。
MQOO_BIND_ON_OPEN- MQOPEN 调用上的
MQOO_BIND_ON_OPEN选项指定要修复目标队列管理器。 如果在集群内存在同一个队列的多个实例,那么请使用MQOO_BIND_ON_OPEN选项。 放入队列并且指定从 MQOPEN 调用返回的对象句柄的所有消息都将定向至相同的队列管理器。- 当消息具有亲缘关系时,请使用
MQOO_BIND_ON_OPEN选项。 例如,如果一批消息全部由同一个队列管理器来进行处理,那么打开队列时请指定MQOO_BIND_ON_OPEN。 IBM® MQ 会修订队列管理器以及放入该队列的所有消息所采用的路由。 - 如果指定了
MQOO_BIND_ON_OPEN选项,那么必须重新打开此队列才能选择队列的新实例。
- 当消息具有亲缘关系时,请使用
MQOO_BIND_NOT_FIXED- MQOPEN 调用上的
MQOO_BIND_NOT_FIXED选项指定目标队列管理器不固定。 写入队列并指定从 MQOPEN 调用返回的对象句柄的消息将根据每条消息路由至执行 MQPUT 时的队列管理器。 如果不希望强制降所有消息写入相同目标,那么请使用MQOO_BIND_NOT_FIXED选项。- 请勿同时指定
MQOO_BIND_NOT_FIXED和MQMF_SEGMENTATION_ALLOWED。 如果同时指定这两者,那么可能将消息段传递到分散于集群中的不同队列管理器。
- 请勿同时指定
MQOO_BIND_ON_GROUP- 允许应用程序请求将一组消息分配给同一个目标实例。 此选项仅对于队列有效,并且仅影响集群队列。 如果为不是集群队列的队列指定此选项,则会忽略此选项。
- 仅当在 MQPUT 上指定 MQPMO_LOGICAL_ORDER 时,才会将组路由至单个目标。 指定了 MQOO_BIND_ON_GROUP 但消息不属于某个逻辑组时,会改为使用 BIND_NOT_FIXED 行为。
注意 :当使用BIND_ON_GROUP打开连接时,分组消息将发送到集群队列。 在此期间,如果群集接收器队列的PUT操作在达到其最大深度后被禁用,则接收器队列管理器随后将被迫对组内剩余的部分消息进行负载均衡。 默认情况下,这种分配遵循循环模式,因为接收方队列管理器不知道发送端最初做出的负载均衡决策。 MQOO_BIND_AS_Q_DEF- 如果不指定
MQOO_BIND_ON_OPEN、MQOO_BIND_NOT_FIXED或MQOO_BIND_ON_GROUP,缺省选项为MQOO_BIND_AS_Q_DEF。 使用MQOO_BIND_AS_Q_DEF会导致从 DefBind 查询属性中提取用于队列句柄的绑定。
MQOPEN 选项的相关性
MQOPEN 选项 MQOO_BROWSE, MQOO_INPUT_* 或 MQOO_SET 需要集群队列的本地实例才能使 MQOPEN 成功。
MQOPEN 选项 MQOO_OUTPUT、MQOO_BIND_* 或 MQOO_INQUIRE 无需集群队列的本地实例即可成功。