连接到 Websphere MQ 队列管理器在应用程序 A 中有效,但在应用程序 B 中无效
Connecting to Websphere MQ queue manager works in application A but not in application B
我有两个控制台应用程序,A 和 B。
应用程序 A 是为测试目的而创建的,并且按预期工作。
应用程序 B 不起作用,尽管它基本上是 A 代码的复制粘贴:
System.Console.Write("User Name: ");
string username = System.Console.ReadLine();
System.Console.Write("Password: ");
string password = ConsoleReadPassword();
System.Console.WriteLine();
//user and password required because I am also a privileged user
//(member of mqm group)
MQEnvironment.UserId = username;
MQEnvironment.Password = password;
//for application B this line throws exception with code 2538
var queueManager = new MQQueueManager("TEST.QUEUE.MANAGER", "CLIENT.CONN.CHANNEL", "localhost(1414)");
错误代码 2538 表示 "Host not available" 这很奇怪,因为应用程序 A 连接到同一主机没有问题。
这是 MQ 服务器在 MQ Explorer 中的样子:
队列管理器:
队列:
听众:
频道:
两个服务器通道
频道授权记录:
阻止 MQ 管理员连接到队列管理器的默认通道身份验证记录。它略有修改(添加 ~
前缀)所以现在它不会阻止任何人。
MQ 服务器和应用程序运行在同一台机器上,因此排除了恕我直言的网络问题。
队列管理器错误日志不报告任何错误,但一般错误日志如下所示:
08/02/2016 15:15:23 - Process(13720.10) User([username])
Program(B.EXE) AMQ9202: Remote host 'localhost(1414)' not
available, retry later.
EXPLANATION: The attempt to allocate a conversation using TCP/IP to
host 'localhost(1414)' for channel (Exception) was not successful.
However the error may be a transitory one and it may be possible to
successfully allocate a TCP/IP conversation later.
对于这两个应用程序,我使用相同版本的 amqmdnet.dll
:8.0.0.4
程序A和B的目标框架相同:4.5
在测试时,我没有尝试同时 运行 这两个应用程序,我在 MQ Explorer 中检查了通道是否空闲(不活动)。
我也尝试更改生成的程序集的名称但没有效果。
有谁知道什么会导致应用程序 B 无法连接?
当使用主机名 localhost
时,仍然涉及网络,这一切都发生在一台机器内。如果应用程序 A 运行 与您的队列管理器在同一台机器上,那么使用连接名称 localhost(1414)
的应用程序 A 连接肯定会起作用,但没有必要像这样建立连接(即使用 TCP/IP) 您可以改为建立本地绑定连接。
另一方面,如果您使用 TCP/IP 因为应用程序 B 运行 在与队列管理器 运行 不同的机器上,则使用 localhost(1414)
将不起作用,因为一台机器上的 localhost
没有连接到另一台机器上的 localhost
。您应该将应用程序的连接名称中指定的内容从 localhost(1414)
更改为使用队列管理器机器的 IP 地址(或主机名)(跟以前一样是端口号)。
虽然我无法找到问题的原因,但解决方案只是
删除并重新创建项目。
这是我之前尝试过的,也是促使我采取此行动的原因:
- 在 B 中,我删除并重新添加了对 amqmdnet.dll 的引用 - 不工作
- 我创建了另一个项目(我们称之为 C):控制台应用程序,相同的代码 - working
我重命名* C 与 B 同名的项目 - 仍在工作
*非工作项目的名称包含一个点,所以我认为这可能会导致问题 - 事实并非如此。
我有两个控制台应用程序,A 和 B。 应用程序 A 是为测试目的而创建的,并且按预期工作。 应用程序 B 不起作用,尽管它基本上是 A 代码的复制粘贴:
System.Console.Write("User Name: ");
string username = System.Console.ReadLine();
System.Console.Write("Password: ");
string password = ConsoleReadPassword();
System.Console.WriteLine();
//user and password required because I am also a privileged user
//(member of mqm group)
MQEnvironment.UserId = username;
MQEnvironment.Password = password;
//for application B this line throws exception with code 2538
var queueManager = new MQQueueManager("TEST.QUEUE.MANAGER", "CLIENT.CONN.CHANNEL", "localhost(1414)");
错误代码 2538 表示 "Host not available" 这很奇怪,因为应用程序 A 连接到同一主机没有问题。
这是 MQ 服务器在 MQ Explorer 中的样子:
队列管理器:
队列:
听众:
频道:
频道授权记录:
~
前缀)所以现在它不会阻止任何人。
MQ 服务器和应用程序运行在同一台机器上,因此排除了恕我直言的网络问题。
队列管理器错误日志不报告任何错误,但一般错误日志如下所示:
08/02/2016 15:15:23 - Process(13720.10) User([username]) Program(B.EXE) AMQ9202: Remote host 'localhost(1414)' not available, retry later.
EXPLANATION: The attempt to allocate a conversation using TCP/IP to host 'localhost(1414)' for channel (Exception) was not successful. However the error may be a transitory one and it may be possible to successfully allocate a TCP/IP conversation later.
对于这两个应用程序,我使用相同版本的 amqmdnet.dll
:8.0.0.4
程序A和B的目标框架相同:4.5
在测试时,我没有尝试同时 运行 这两个应用程序,我在 MQ Explorer 中检查了通道是否空闲(不活动)。
我也尝试更改生成的程序集的名称但没有效果。
有谁知道什么会导致应用程序 B 无法连接?
当使用主机名 localhost
时,仍然涉及网络,这一切都发生在一台机器内。如果应用程序 A 运行 与您的队列管理器在同一台机器上,那么使用连接名称 localhost(1414)
的应用程序 A 连接肯定会起作用,但没有必要像这样建立连接(即使用 TCP/IP) 您可以改为建立本地绑定连接。
另一方面,如果您使用 TCP/IP 因为应用程序 B 运行 在与队列管理器 运行 不同的机器上,则使用 localhost(1414)
将不起作用,因为一台机器上的 localhost
没有连接到另一台机器上的 localhost
。您应该将应用程序的连接名称中指定的内容从 localhost(1414)
更改为使用队列管理器机器的 IP 地址(或主机名)(跟以前一样是端口号)。
虽然我无法找到问题的原因,但解决方案只是
删除并重新创建项目。
这是我之前尝试过的,也是促使我采取此行动的原因:
- 在 B 中,我删除并重新添加了对 amqmdnet.dll 的引用 - 不工作
- 我创建了另一个项目(我们称之为 C):控制台应用程序,相同的代码 - working
我重命名* C 与 B 同名的项目 - 仍在工作
*非工作项目的名称包含一个点,所以我认为这可能会导致问题 - 事实并非如此。