我有两个配置了相同队列名称的 MQ 队列管理器。两者都配置为将数据发送到不同的服务器。当前队列管理器(QM1)已停止(状态立即结束)并且 QM2 正在运行
现在我的程序打开队列并发送数据。它不指定队列管理器名称。当我执行程序时,MQ 连接请求返回error 2059
。
我的问题是:
- 当多个队列管理器具有相同的队列名称时会发生什么?
- 如何在不更改代码的情况下解决问题?
如果描述含糊,请见谅。如果有人提供链接以便像我这样的新手可以学到一些东西,那将会很有帮助。
谢谢
如果可以提供有关您的应用程序的详细信息,将会很有帮助。无论是使用服务器绑定还是客户端模式连接到队列管理器。您使用的是哪个版本的 MQ?
以下信息适用于 MQ v7.x:
如果您使用客户端模式,则可以使用多个 CONNNAME 进行连接。如果一个队列管理器关闭,您的应用程序将连接到 CONNAME 列表中的下一个队列管理器。使用客户端模式连接时最简单的方法之一是定义 MQSERVER 环境变量并指定多个 CONNNAME。
SET MQSERVER=<channel name>/TCP/host1(port1), host2(port2)
例如,当两个队列管理器都在本地主机上时:
SET MQSERVER=MYSVRCONCHN/TCP/localhost(1414),localhost(1415)
在服务器绑定模式下,如果未指定队列管理器名称,则应用程序将尝试连接到默认队列管理器。如果默认队列管理器关闭,则抛出 2059。
您的解释没有明确说明您的要求。
你写了:
我的问题是 1. 当多个队列管理器具有相同的队列名称时会发生什么。
没有。这是一个正常的情况。不同的队列管理器可能有同名的队列,这不会产生任何歧义。虽然,当队列管理器在同一个集群中并且队列也是一个集群队列时,场景会有所不同。那么一切都将取决于需求和设计。
你写了:
2.如何在不更改代码的情况下处理情况
你写了:
现在我的程序打开队列并发送数据。它不指定队列管理器名称。
您正在使用什么应用程序?对于客户端应用程序,您使用队列管理器的对象访问队列。我假设您使用的应用程序(客户端)不从您那里获取队列管理器详细信息,只获取队列详细信息。并且可能是队列管理器在代码中被硬编码。它首先将消息发送到队列管理器 1 的队列,然后再发送到队列管理器 2。但是,在您的情况下,队列管理器 1 已关闭。
如果是上述情况,则需要更改应用程序的代码。您应该以这样的方式进行异常处理,即使第一行代码抛出错误,它也会执行将消息发送到第二个队列管理器的代码。