【发布时间】:2016-03-21 16:45:01
【问题描述】:
我有一个 C# 应用程序,它从 WebSphere 队列(MQ 版本 7.5)读取消息并将它们提交到另一个应用程序,我需要更新该应用程序以适应队列管理器停止或断开连接时的情况。我已更新队列管理器属性以添加“自动重新连接”选项,但我很难检测到队列管理器再次可用。
我的应用程序最多等待 3 秒以等待消息出现在队列中,然后,如果没有消息出现,则在循环并再次等待队列消息之前执行其他内务检查。
我的队列管理器初始化现在包括语句
QueueManagerProperties.Add(MQC.CONNECT_OPTIONS_PROPERTY, MQC.MQCNO_RECONNECT);
当我停止 MQ 服务器上的队列管理器时,我可以看到 QueueManager 属性 IsConnected 是否变为 false。如果我在队列管理器断开连接时尝试从队列执行“获取”操作,我会从底层 IBM MQ 接口库中收到“对象未设置为实例”错误。
但是,当我在 MQ 服务器上重新启动队列管理器时,我的应用程序中的 IsConnected 选项仍然为 false,因此我无法检测到何时可以安全地再次尝试从队列中读取消息。无论我做什么,我似乎都无法检测到队列管理器已重新连接,因此应用程序永远不会再次开始读取消息。
任何关于我需要更新的建议都将不胜感激。
【问题讨论】:
-
确保您通过
Client Channel Definition Table连接 -
MQ .NET 客户端将尝试重新连接到队列,默认时间为 30 分钟。如果它在那 30 分钟内失败,则应用程序必须再次发出“连接”呼叫。那么在您的应用程序发出“Get”调用多长时间后?
-
在我的测试环境中,我尝试在 5 分钟内重新连接。但是,我注意到,如果我在队列管理器断开连接时尝试“获取”命令,则底层 IBM 库崩溃并出现“对象未设置为实例”错误。即,当与 MQ 服务器的连接中断时,我似乎无法发出 Get 命令。