MQ 错误原因:2058 在正常工作多天后随机开始出现在 C# .NET 客户端中

MQ Error Reason: 2058 randomly starts occurring in C# .NET client after working correctly for multiple days

客户端详细信息:问题发生在代码充当生产者将消息推送到 IBM MQ 队列和主题时。生产者使用 WebApi2 作为 REST 接口公开,并部署在 IIS 上。我们正在使用 C# .NET (4.5.2) 客户端连接到 IBM MQ。我们使用 CCDT 文件 AMQCLCHL.TAB 进行连接以获取客户端连接详细信息。使用的底层库是 Apache NMS (1.8.0.4573) 和 IBM XMS (2.5.0.3)。

接收到异常: CWSMQ0006E:在调用方法 ConnectionFactory.CreateConnection 期间接收到异常:CompCode:2,原因:2058。

错误详细信息:客户端正常工作,我们能够将数十万条消息推送到 MQ 队列和主题。但是,在从几个小时到超过 1 周的随机时间段之后,客户端开始失败并出现上述错误。更多细节:

在 AMQERR01.LOG 文件中发现错误。

AMQ9516: File error occurred.

EXPLANATION: The filesystem returned error code 6 for file'\...\AMQCLCHL.TAB'. 

ACTION: Record the name of the file '\...\AMQCLCHL.TAB' and tell the systems administrator, who should ensure that file '\...\AMQCLCHL.TAB' is correct and available. 

错误代码 6 是 ERROR_INVALID_HANDLE

连接关闭时会发生这种情况(可能是远程服务器重启、网络问题等...)。这真的让我回想起 - 我记得在 2002 年处理这个问题,将 Java J2EE 应用程序连接到 OS/390 上的 MQ。

最近 IBM 实现了自动重新连接设置,可以在 CCDT 中设置或在 C# 对象上手动设置。这是在 XMS page, and the documentation for implementing that is here.

上总结的

The properties Client Reconnect Options, Client Reconnect Timeout, and Connection Namelist can also be set via Client Channel Definitions Table (CCDT) or by enabling the client reconnection via the mqclient.ini file.

根据@JoshMc 的建议,我们注意到 AMQERR01.LOG 文件中与访问 NAS 上的 AMQCLCHL.TAB 文件相关的间歇性错误。这似乎弄乱了我们这一端的非托管客户端,只能通过重新启动 IIS 来修复。我们的设置已更新为将此文件移动到服务器上的本地磁盘,然后将我们的代码指向它。这解决了这个问题,自从进行此更改以来的最后两周,我们一直没有出现任何问题。