每个 host/port 是否允许超过一个队列管理器?
Are there more than one queue manager allowed per host/port?
当设置一个MQQueueConnectionFactory
时我们初始化它如下:
MQQueueConnectionFactory factory = new MQQueueConnectionFactory();
factory.setQueueManager(queueManager);
factory.setTransportType(CommonConstants.WMQ_CM_CLIENT);
factory.setHostName(host);
factory.setPort(port);
factory.setChannel(channel);
特别是我们设置了队列管理器的名称。从这个模式看来,队列管理器名称似乎是完全识别队列管理器所必需的。人们可能会得出结论,在同一主机和端口上,不同的队列管理器可能会侦听。这可能吗?
但是,当设置 the connection name list 以指定重新连接目标时,不需要队列管理器名称:
public void setConnectionNameList(java.lang.String hosts) throws javax.jms.JMSException
Specifies the hosts to which the client will attempt to reconnect to after its connection is broken. The connection name list is a comma seperated list of host/ip port pairs. eg. 127.0.0.1(1414),host2.example.com(1400) The default setting of this property is 'localhost(1414)' A null, or empty string is taken to mean localhost(1414)
在设置 client reconnect options 时,两个选项在这种情况下似乎很重要:
- WMQ_CLIENT_RECONNECT - Reconnect to the any of the queue managers specified in the connection name list
- WMQ_CLIENT_RECONNECT_Q_MGR - Reconnect to the same queue manager we were originally connected to. This will throw MQRC_RECONNECT_QMID_MISMATCH if the queue manager it tries to connect to (specified in the connection name list) has a different QMID to the queue manager originally connected to.
这些文档不清楚是否可以在同一个 host/port 后面使用多个队列管理器。将此与 Oracle 进行比较,其中多个服务可以由同一个侦听器提供服务。
我们有两个队列管理器侦听具有不同名称的不同 hosts/ports。我们想使用这些队列管理器之一作为连接名称列表中的故障转移管理器。问题是:队列管理器是否仅由主机和端口唯一标识?
这个问题有很多要解决的问题,所以让我们一次解决一个问题。
只能有一个侦听器绑定到特定端口和接口。因此,如果侦听器是混杂的(在所有接口上侦听),则每个端口只有一个。如果主机有多个接口,则可以在每个接口的同一个端口上绑定单独的侦听器。由于侦听器是队列管理器的子进程,这意味着只有一个 QMgr 可以侦听给定的 address(port)
组合。
QMgr 名称不需要出现在 QMgr 收到的连接请求中。如果 QMgr 名称为空,则与连接请求所针对的任何 QMgr 的连接都会成功,前提是 QMgr 不会因密码错误、证书验证或其他错误而拒绝它。但是,如果连接请求中的 QMgr 名称 是 ,它 必须 与尝试连接的 QMgr 的名称相匹配。
连接名单(更恰当地说 CONNAME
)是以逗号分隔的 address(port)
组合列表,这些组合有资格接收所请求的连接。
多实例 QMgrs 有两个地址和一个端口。它们仅在一个地址上处于活动状态,并且指向它们的通道必须具有两个地址才能可靠地连接。但是,它不需要 QMgr 名称。
但是还有另一种类型的 HA,其中有多个等效的 QMgr,每个 QMgr 都有不同的名称,客户端可以连接到这些 QMgr。当客户从记录系统请求信息但本身不是记录系统时尤其如此。这样的客户端不需要监听众所周知的队列。相反,它连接到客户端连接 QMgrs 层中的任何一个,创建一个动态回复队列,并将请求发送到记录系统,该记录系统监听 MQ 网络中某处的集群队列。在这种情况下,客户端不指定 QMgr 名称,因此利用了 MQ 接受它连接到的任何 QMgr 的行为。
最后,MQ 早就有了客户端通道定义 Table 或 CCDT 文件。在我们拥有多实例 CONNAME
之前,CCDT 提供了连接到多个 QMgr 中的任何一个的能力。 MQ Admin 没有在 CCDT 中放置 QMgr 名称,而是放置了符号名称。例如,如果有 3 个 QMgrs 用于 Payroll 处理,则其 CCDT 条目中的 QMgr 名称可能是 PAY01、PAY02 和 PAY03,其中 none 与实际 QMgr 名称匹配。其中每一个都有一个 address(port)
指向三个 QMgrs 之一。然后,开发人员指定 QMgr 名称 *PAY
,MQ 客户端将在前 3 个字符与 'PAY' 匹配的所有 CCDT 条目中进行选择。使用此选项和其他一些选项,可以让 MQ 客户端驱动器重新连接,但让 MQ 客户端存根封装是否在目的地之间循环、重试上次连接的地址或其他任何逻辑。
From this pattern it seems that the queue manager name is necessary to
fully identify the queue manager. One might concluded that on the same
host and port a different queue manager might listen. Is this
possible?
没有
We have two queue managers listening on different hosts/ports which
have different names. We want to use one of these queue managers as
failover manager in the connection name list. The question is: is the
queue manager uniquely identified by host and port only?
确保请求中的 QMgr 名称为空,并在 CONNAME
中指定两个 address(port)
组合,这样你就可以开始了。
请参阅:Role of the client channel definition table, and in particular in that section Queue manager groups in the CCDT. The section on Examples of channel weighting and affinity 在这里也有帮助。
最后,请确保您使用的是现代客户端。由于 MQ 客户端可以连接到任何前向或后向级别的 QMgr,因此可以在 v9.0 客户端上进行开发并连接到 v7.1 QMgr。当然,所提供的功能是基于最低版本的客户端或 QMgr,因此您无法通过 v9.0 客户端和古老的 QMgr 获得 JMS 1.2 功能。但是,您 确实 获得了更高版本客户端中的所有性能改进和错误修复。如果您不是最新的客户端(或您的 JEE 服务器支持的最新客户端),请在以下位置下载一个:
就像侦听唯一 TCP 端口的任何其他服务器应用程序一样,IBM MQ 队列管理器侦听主机上的唯一 TCP 端口。因此,没有两个队列管理器可以侦听主机上的同一个端口。连接到队列管理器需要主机和端口的组合(a.k.a 连接名称或简称 CONNAME)。
连接名称列表用于指定多个主机和端口。 MQ 客户端使用此信息在活动队列管理器关闭时自动重新连接到多实例队列管理器或备份队列管理器的备用实例。
进入您的场景:您可以在连接工厂中省略队列管理器名称,并通过 setConnectionNameList 方法简单地指定多个 host/port 组合。非常重要:您必须确保两个队列管理器具有相同的对象定义,例如用于应用程序连接的服务器连接通道、queues/topics、权限等。否则您的应用程序可能会失败。
当设置一个MQQueueConnectionFactory
时我们初始化它如下:
MQQueueConnectionFactory factory = new MQQueueConnectionFactory();
factory.setQueueManager(queueManager);
factory.setTransportType(CommonConstants.WMQ_CM_CLIENT);
factory.setHostName(host);
factory.setPort(port);
factory.setChannel(channel);
特别是我们设置了队列管理器的名称。从这个模式看来,队列管理器名称似乎是完全识别队列管理器所必需的。人们可能会得出结论,在同一主机和端口上,不同的队列管理器可能会侦听。这可能吗?
但是,当设置 the connection name list 以指定重新连接目标时,不需要队列管理器名称:
public void setConnectionNameList(java.lang.String hosts) throws javax.jms.JMSException
Specifies the hosts to which the client will attempt to reconnect to after its connection is broken. The connection name list is a comma seperated list of host/ip port pairs. eg. 127.0.0.1(1414),host2.example.com(1400) The default setting of this property is 'localhost(1414)' A null, or empty string is taken to mean localhost(1414)
在设置 client reconnect options 时,两个选项在这种情况下似乎很重要:
- WMQ_CLIENT_RECONNECT - Reconnect to the any of the queue managers specified in the connection name list
- WMQ_CLIENT_RECONNECT_Q_MGR - Reconnect to the same queue manager we were originally connected to. This will throw MQRC_RECONNECT_QMID_MISMATCH if the queue manager it tries to connect to (specified in the connection name list) has a different QMID to the queue manager originally connected to.
这些文档不清楚是否可以在同一个 host/port 后面使用多个队列管理器。将此与 Oracle 进行比较,其中多个服务可以由同一个侦听器提供服务。
我们有两个队列管理器侦听具有不同名称的不同 hosts/ports。我们想使用这些队列管理器之一作为连接名称列表中的故障转移管理器。问题是:队列管理器是否仅由主机和端口唯一标识?
这个问题有很多要解决的问题,所以让我们一次解决一个问题。
只能有一个侦听器绑定到特定端口和接口。因此,如果侦听器是混杂的(在所有接口上侦听),则每个端口只有一个。如果主机有多个接口,则可以在每个接口的同一个端口上绑定单独的侦听器。由于侦听器是队列管理器的子进程,这意味着只有一个 QMgr 可以侦听给定的 address(port)
组合。
QMgr 名称不需要出现在 QMgr 收到的连接请求中。如果 QMgr 名称为空,则与连接请求所针对的任何 QMgr 的连接都会成功,前提是 QMgr 不会因密码错误、证书验证或其他错误而拒绝它。但是,如果连接请求中的 QMgr 名称 是 ,它 必须 与尝试连接的 QMgr 的名称相匹配。
连接名单(更恰当地说 CONNAME
)是以逗号分隔的 address(port)
组合列表,这些组合有资格接收所请求的连接。
多实例 QMgrs 有两个地址和一个端口。它们仅在一个地址上处于活动状态,并且指向它们的通道必须具有两个地址才能可靠地连接。但是,它不需要 QMgr 名称。
但是还有另一种类型的 HA,其中有多个等效的 QMgr,每个 QMgr 都有不同的名称,客户端可以连接到这些 QMgr。当客户从记录系统请求信息但本身不是记录系统时尤其如此。这样的客户端不需要监听众所周知的队列。相反,它连接到客户端连接 QMgrs 层中的任何一个,创建一个动态回复队列,并将请求发送到记录系统,该记录系统监听 MQ 网络中某处的集群队列。在这种情况下,客户端不指定 QMgr 名称,因此利用了 MQ 接受它连接到的任何 QMgr 的行为。
最后,MQ 早就有了客户端通道定义 Table 或 CCDT 文件。在我们拥有多实例 CONNAME
之前,CCDT 提供了连接到多个 QMgr 中的任何一个的能力。 MQ Admin 没有在 CCDT 中放置 QMgr 名称,而是放置了符号名称。例如,如果有 3 个 QMgrs 用于 Payroll 处理,则其 CCDT 条目中的 QMgr 名称可能是 PAY01、PAY02 和 PAY03,其中 none 与实际 QMgr 名称匹配。其中每一个都有一个 address(port)
指向三个 QMgrs 之一。然后,开发人员指定 QMgr 名称 *PAY
,MQ 客户端将在前 3 个字符与 'PAY' 匹配的所有 CCDT 条目中进行选择。使用此选项和其他一些选项,可以让 MQ 客户端驱动器重新连接,但让 MQ 客户端存根封装是否在目的地之间循环、重试上次连接的地址或其他任何逻辑。
From this pattern it seems that the queue manager name is necessary to fully identify the queue manager. One might concluded that on the same host and port a different queue manager might listen. Is this possible?
没有
We have two queue managers listening on different hosts/ports which have different names. We want to use one of these queue managers as failover manager in the connection name list. The question is: is the queue manager uniquely identified by host and port only?
确保请求中的 QMgr 名称为空,并在 CONNAME
中指定两个 address(port)
组合,这样你就可以开始了。
请参阅:Role of the client channel definition table, and in particular in that section Queue manager groups in the CCDT. The section on Examples of channel weighting and affinity 在这里也有帮助。
最后,请确保您使用的是现代客户端。由于 MQ 客户端可以连接到任何前向或后向级别的 QMgr,因此可以在 v9.0 客户端上进行开发并连接到 v7.1 QMgr。当然,所提供的功能是基于最低版本的客户端或 QMgr,因此您无法通过 v9.0 客户端和古老的 QMgr 获得 JMS 1.2 功能。但是,您 确实 获得了更高版本客户端中的所有性能改进和错误修复。如果您不是最新的客户端(或您的 JEE 服务器支持的最新客户端),请在以下位置下载一个:
就像侦听唯一 TCP 端口的任何其他服务器应用程序一样,IBM MQ 队列管理器侦听主机上的唯一 TCP 端口。因此,没有两个队列管理器可以侦听主机上的同一个端口。连接到队列管理器需要主机和端口的组合(a.k.a 连接名称或简称 CONNAME)。
连接名称列表用于指定多个主机和端口。 MQ 客户端使用此信息在活动队列管理器关闭时自动重新连接到多实例队列管理器或备份队列管理器的备用实例。
进入您的场景:您可以在连接工厂中省略队列管理器名称,并通过 setConnectionNameList 方法简单地指定多个 host/port 组合。非常重要:您必须确保两个队列管理器具有相同的对象定义,例如用于应用程序连接的服务器连接通道、queues/topics、权限等。否则您的应用程序可能会失败。