连接到Websphere MQ队列管理器在应用程序A中工作,但在应用程序B中不工作

时间:2016-02-08 13:56:13

标签: c# ibm-mq

我有两个控制台应用程序, 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 Server在MQ Explorer中的外观:

队列经理: queue managers

队列: queues

监听: listeners

渠道: channels 两个服务器频道

频道授权记录: channel authentication records 默认通道验证记录,可防止MQ管理员连接到队列管理器。它略有修改(添加了~前缀)所以现在它不会阻止任何人。

MQ服务器和应用程序在同一台计算机上运行,​​因此排除了imho网络问题。

队列管理器错误日志不报告任何错误,但一般错误日志如下所示:

  

08/02/2016 15:15:23 - 流程(13720.10)用户([用户名])   程序(B.EXE)AMQ9202:远程主机' localhost(1414)'不   可用,稍后再试。

     

说明:尝试使用TCP / IP分配对话   host' localhost(1414)'对于频道(例外)未成功。   然而,错误可能是暂时的,并且可能是错误的   稍后成功分配TCP / IP对话。

对于这两个应用程序,我使用相同版本的amqmdnet.dll:8.0.0.4

程序A和B都有相同的目标框架:4.5

在测试时,我没有尝试同时运行这两个应用程序,如果通道是免费的(非活动),我在MQ Explorer中检查。

我还尝试更改生成的程序集的名称,但没有效果。

有谁知道什么可能导致应用 B 无法连接?

2 个答案:

答案 0 :(得分:0)

当使用主机名localhost仍然涉及网络时,它只发生在一台机器内。如果应用程序A与队列管理器在同一台机器上运行,那么使用连接名称localhost(1414)进行应用程序A连接肯定会有效,但是没有必要像这样建立连接(即使用TCP / IP)而是建立一个本地绑定连接。

另一方面,如果您使用的是TCP / IP,因为应用程序B正在运行队列管理器的其他计算机上运行,​​那么使用localhost(1414)将无效,因为localhost机器无法连接到另一台机器上的localhost。您应该从localhost(1414)更改应用程序连接名称中指定的内容,以使用队列管理器计算机的IP地址(或主机名)(如前所述,使用端口号)。

答案 1 :(得分:0)

虽然我无法找到问题的原因,但解决方案只是

删除并重新创建项目

这是我之前尝试的,是什么促使我采取这一行动:

  • B 中,我删除了,然后添加了对amqmdnet.dll的引用 - 无法正常工作
  • 我创建了另一个项目(让我们称之为 C ):控制台应用程序,相同代码 - 正常工作
  • 我将 C 项目重命名为 B - 仍然有效

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