Java 每个主机/端口是否允许有多个队列管理器?

Java 每个主机/端口是否允许有多个队列管理器?,java,jms,ibm-mq,Java,Jms,Ibm Mq,设置MQQueueConnectionFactory时,我们按如下方式初始化它: MQQueueConnectionFactory factory = new MQQueueConnectionFactory(); factory.setQueueManager(queueManager); factory.setTransportType(CommonConstants.WMQ_CM_CLIENT); factory.setHostName(host); factory.setPort(p

设置
MQQueueConnectionFactory
时,我们按如下方式初始化它:

MQQueueConnectionFactory factory = new MQQueueConnectionFactory();

factory.setQueueManager(queueManager);

factory.setTransportType(CommonConstants.WMQ_CM_CLIENT);
factory.setHostName(host);
factory.setPort(port);
factory.setChannel(channel);
我们特别设置了队列管理器的名称。从这个模式来看,队列管理器名称似乎是完全标识队列管理器所必需的。可以得出结论,在同一主机和端口上,可能会有不同的队列管理器侦听。这可能吗

但是,当设置以指定重新连接目标时,不需要队列管理器名称:

public void setConnectionNameList(java.lang.String主机)抛出javax.jms.jmsceception

指定客户端断开连接后将尝试重新连接到的主机。连接名称列表是以逗号分隔的主机/ip端口对列表。例如127.0.0.1(1414)、host2.example.com(1400)此属性的默认设置为“localhost(1414)”。空字符串表示localhost(1414)

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

  • WMQ_CLIENT_RECONNECT-重新连接到连接名称列表中指定的任何队列管理器
  • WMQ_CLIENT_RECONNECT_Q_MGR-重新连接到我们最初连接到的同一队列管理器。如果尝试连接到的队列管理器(在连接名称列表中指定)与最初连接到的队列管理器具有不同的QMID,则这将引发MQRC_RECONNECT_QMID_MISMATCH
这些文档不清楚是否可以在同一主机/端口后面使用多个队列管理器。与Oracle相比,Oracle可以由同一个侦听器提供多个服务


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

在这个问题中有很多问题需要解决,所以让我们一次处理一个项目

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

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

连接名称列表(更准确地说是
CONNAME
)是一个逗号分隔的列表,其中包含符合条件接收所请求连接的
地址(端口)
组合

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

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

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

从这个模式来看,似乎需要使用队列管理器名称 完全识别队列管理器。人们可能会得出同样的结论 不同队列管理器可能侦听的主机和端口。这是吗 可能吗

没有

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

确保请求中的QMgr名称为空,并在
CONNAME
中指定两个
地址(端口)
组合,这样您就可以开始了

请参见:,尤其是该部分。关于的部分在这里也很有用

最后,确保您使用的是现代客户端。由于MQ客户端可以连接到任何前向或后向级别的QMgr,因此可以在v9.0客户端上开发并连接到v7.1 QMgr。当然,提供的功能是基于lowe的