连接到 Websphere MQ 队列管理器在应用程序 A 中有效,但在应用程序 B 中无效

Connecting to Websphere MQ queue manager works in application A but not in application B

我有两个控制台应用程序,AB。 应用程序 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
  • 我重命名* CB 同名的项目 - 仍在工作

    *非工作项目的名称包含一个点,所以我认为这可能会导致问题 - 事实并非如此。