2016-11-15 73 views
2

在设置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端口对列表。例如。 (1414),host2.example.com(1400)此属性的默认设置为'localhost(1414)'null或空字符串表示本地主机(1414)

设置在client reconnect options两个选项似乎在这方面很重要:

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

这些单证制作尚不清楚,如果在同一台主机/端口后面多个队列管理器是可能的。将此与Oracle可以由同一个侦听器提供多个服务的情况相比较。

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

+0

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

回答

3

在这个问题中有很多需要放松的地方,让我们一次拿一件物品。

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

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

连接名称列表(更合适CONNAME)是有资格接收所请求的连接的逗号分隔的address(port)组合列表。

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

但还有另一种类型的HA,其中有多个等价的QMgrs,每个具有不同的名称,客户端可以连接到这些QMgr。当客户从记录系统请求信息但本身不是记录系统时尤其如此。这样的客户端不需要听取众所周知的队列。相反,它连接到任何一层客户端连接QMgrs,创建一个动态的Reply-To队列,并将请求发送到监听系统,记录系统监听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客户端将在所有CCDT条目中选择前3个字符匹配“PAY”。有了这个和其他一些选项,可以让MQ客户端驱动器重新连接,但让MQ客户端存根封装了是否在目标之间循环,重试最后连接的地址等等的逻辑。

从这种模式看来,队列管理器名称是必需的,以便 完全识别队列管理器。有人可能会得出结论,在不同的队列管理器可能会监听同一主机和端口上的 。这可能是 吗?

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

确保QMGR名称是请求空白并指定CONNAMEaddress(port)组合,你应该是好去。

请参阅:Role of the client channel definition table,特别是在该部分Queue manager groups in the CCDT。关于Examples of channel weighting and affinity的部分在这里也很有帮助。

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

+0

如果我可以投两次,我会这样做! – Claude

1

就像任何其他服务器应用程序侦听唯一的TCP端口,IBM MQ队列管理器侦听主机上的唯一TCP端口。所以没有两个队列管理器可以在主机上的相同端口上侦听。主机和端口(简称a.k.a连接名称或CONNAME)的组合需要连接到队列管理器。

连接名称列表用于指定多个主机端口&。在活动队列管理器关闭的情况下,MQ客户机使用此信息自动重新连接到多实例队列管理器或备份队列管理器的备用实例。

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

相关问题