【问题标题】:Are there more than one queue manager allowed per host/port?每个主机/端口是否允许多个队列管理器?
【发布时间】:2017-03-29 08:37:37
【问题描述】:

在设置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

指定客户端在连接断开后将尝试重新连接的主机。连接名称列表是以逗号分隔的主机/IP 端口对列表。例如。 127.0.0.1(1414),host2.example.com(1400) 这个属性的默认设置是'localhost(1414)' 一个null,或者空字符串被认为是localhost(1414)

在设置client reconnect options 时,在这种情况下,两个选项似乎很重要:

  • WMQ_CLIENT_RECONNECT - 重新连接到连接名称列表中指定的任何队列管理器
  • WMQ_CLIENT_RECONNECT_Q_MGR - 重新连接到我们最初连接的同一个队列管理器。如果它尝试连接的队列管理器(在连接名称列表中指定)与最初连接的队列管理器具有不同的 QMID,这将抛出 MQRC_RECONNECT_QMID_MISMATCH。

这些文档不清楚是否可以在同一主机/端口后面使用多个队列管理器。将此与 Oracle 相比,其中多个服务可以由同一个侦听器提供服务。

我们有两个队列管理器在不同名称的不同主机/端口上进行侦听。我们希望将这些队列管理器之一用作连接名称列表中的故障转移管理器。问题是:队列管理器是否仅由主机和端口唯一标识?

【问题讨论】:

  • 感谢您的投票并接受。请注意稍后使用指向相关文档链接的指针进行的更新。 CCDT 组主要是通用 QMgr 名称所需要的,因此即使不使用也很容易理解。

标签: java jms ibm-mq


【解决方案1】:

这个问题有很多内容要解开,所以让我们一次一个项目。

只能有一个侦听器绑定到特定端口和接口。因此,如果侦听器是混杂的(侦听所有接口),则每个端口只有一个。如果主机有多个接口,则可以在每个接口上的同一端口上绑定单独的侦听器。由于监听器是队列管理器的子进程,这意味着只有一个 QMgr 可以监听给定的address(port) 组合。

QMgr 名称不需要出现在 QMgr 收到的连接请求中。如果 QMgr 名称为空,则与连接请求所针对的任何 QMgr 的连接都会成功,前提是 QMgr 不会因密码错误、证书验证或其他错误而拒绝它。但是,如果 QMgr 名称​​是在连接请求中,它必须与尝试连接的 QMgr 的名称匹配。

连接名称列表(更准确地说是CONNAME)是一个以逗号分隔的address(port) 组合列表,这些组合有资格接收所请求的连接。

多实例 QMgrs 有两个地址和一个端口。它们只在一个地址上处于活动状态,指向它们的通道必须具有两个地址才能可靠地连接。但是,它不需要有 QMgr 名称。

但是还有另一种类型的 HA,其中有多个等效的 QMgrs,每个具有不同的名称,客户端可以连接到这些 QMgrs。当客户从记录系统请求信息但其本身不是记录系统时尤其如此。这样的客户端不需要监听众所周知的队列。相反,它连接到任何一个客户端连接 QMgrs 层,创建一个动态回复队列,并将请求发送到记录系统,该系统在 MQ 网络中某处的集群队列上侦听。在这种情况下,客户端没有指定 QMgr 名称,因此可以利用 MQ 接受它连接到的任何 QMgr 的行为。

最后,MQ 早就有了客户端通道定义表或 CCDT 文件。在我们拥有多实例 CONNAME 之前,CCDT 提供了连接到多个 QMgrs 中的任何一个的能力。 MQ Admin 不是在 CCDT 中放置 QMgr 名称,而是放置符号名称。例如,如果有 3 个 QMgr 用于工资核算处理,则其 CCDT 条目中的 QMgr 名称可能是 PAY01、PAY02 和 PAY03,它们都不匹配实际的 QMgr 名称。每一个都有一个address(port) 指向三个QMgrs 之一。然后,开发人员将 QMgr 名称指定为 *PAY,MQ 客户端将在前 3 个字符匹配“PAY”的所有 CCDT 条目中进行选择。有了这个和其他一些选项,可以让 MQ 客户端驱动器重新连接,但让 MQ 客户端存根封装是否在目标之间循环、重试最后连接的地址等逻辑。

从这个模式看来,队列管理器名称是必要的 完全识别队列管理器。人们可能会得出结论,在同一 host 和 port 不同的队列管理器可能会监听。这是 可能吗?

没有。

我们有两个队列管理器监听不同的主机/端口 有不同的名称。我们想使用这些队列管理器之一作为 连接名称列表中的故障转移管理器。问题是:是 仅由主机和端口唯一标识的队列管理器?

确保请求中的 QMgr 名称为空白,并在 CONNAME 中指定两个 address(port) 组合,然后您就可以开始了。

请参阅:Role of the client channel definition table,尤其是该部分的Queue manager groups in the CCDTExamples of channel weighting and affinity 部分在这里也很有帮助。

最后,请确保您使用的是现代客户端。由于 MQ 客户端可以连接到任何前向或后级 QMgr,因此可以在 v9.0 客户端上进行开发并连接到 v7.1 QMgr。当然,所提供的功能是基于最低版本的客户端或 QMgr,因此您不会通过 v9.0 客户端和古老的 QMgr 获得 JMS 1.2 功能。但是,您确实在以后的客户端版本中获得了所有性能改进和错误修复。如果您不是最新的客户端(或 JEE 服务器支持的最新客户端),请前往以下网址下载:

【讨论】:

    【解决方案2】:

    与侦听唯一 TCP 端口的任何其他服务器应用程序一样,IBM MQ Queue Manager 侦听主机上唯一的 TCP 端口。因此,没有两个队列管理器可以侦听主机上的同一个端口。连接到队列管理器需要主机和端口(也称为连接名称或简称 CONNAME)的组合。

    连接名称列表用于指定多个主机和端口。如果活动队列管理器出现故障,MQ 客户端使用此信息自动重新连接到多实例队列管理器或备用队列管理器的备用实例。

    来到您的场景:您可以在连接工厂中省略队列管理器名称,只需通过 setConnectionNameList 方法指定多个主机/端口组合。非常重要:您必须确保两个队列管理器具有相同的对象定义,例如应用程序连接的服务器连接通道、队列/主题、权限等。否则您的应用程序可能会失败。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-22
      • 1970-01-01
      • 2013-09-05
      • 2016-12-31
      • 2016-02-06
      • 1970-01-01
      • 1970-01-01
      • 2021-08-08
      相关资源
      最近更新 更多