我正在设计一个系统,我需要继续尝试连接到 MQ 服务器单元,我得到一个连接。
默认情况下,如果 MQ 不可用,它将通过异常。如何一次又一次地调用相同的方法,直到我得到连接。我知道我可以使用递归,有没有更好的方法来做到这一点。因为我想避免无限循环。我也想等待进一步的处理,直到我得到连接。
我正在使用带有 C# 的 .net 2.0。它是窗口服务应用程序。
我正在设计一个系统,我需要继续尝试连接到 MQ 服务器单元,我得到一个连接。
默认情况下,如果 MQ 不可用,它将通过异常。如何一次又一次地调用相同的方法,直到我得到连接。我知道我可以使用递归,有没有更好的方法来做到这一点。因为我想避免无限循环。我也想等待进一步的处理,直到我得到连接。
我正在使用带有 C# 的 .net 2.0。它是窗口服务应用程序。
这是基本结构:
while(true)
{
try
{
// attempt connection
break; // Will only get here if an exception was not thrown
}
catch
{
// Logging, sleep statement
}
}
如果您有任何方法可以确定是否无法建立连接(除了抛出异常),请使用它。异常不应该用于流量控制,我展示的示例是针对极端情况的。
为避免循环无限,您可能需要添加计数(例如,仅尝试 10 次)。
在我看来,循环应该是无限的。您想成为因为服务器停机 45 分钟而不得不重新启动服务的人吗?
const int attempts = 3;
const int perAttemptSleep = 5000;
const int perTrialSleep = 600000;
while (true)
{
for (var i = 0; i < attempts; i++)
{
try
{
Connect();
return;
}
catch (ConnectException)
{
Thread.Sleep(perAttemptSleep);
}
}
Log();
Thread.Sleep(perTrialSleep);
}
已经提供的代码示例将为您提供所需的循环,因此我不会重复该建议。不过,我有几点建议。
WMQ v7.0 中的 .Net 功能比 WMQ v6 中的要好得多。可用的选项包括客户端重新连接可以完全在通道配置中处理。由于 v6 已于 2011 年 9 月终止并且这是一个新应用程序,因此我强烈建议使用 WMQ v7 客户端。您可以将它与 v6 QMgr 一起使用,但不会获得所有 v7 功能。最好您也可以使用 v7 QMgr,然后将重新连接行为作为可配置选项。如果您现在使用 v6,则需要在接下来的 18 个月内升级到 v7,才能获得 IBM 的支持。
IBM - MQC7:WebSphere MQ V7.0 客户端http://bit.ly/bXM0q3
假设您将继续编写重新连接逻辑,您肯定希望在重新连接尝试之间至少休眠一整秒,最好是几秒钟。否则将淹没 WMQ 侦听器并执行非常有效的拒绝服务攻击。
请务必在日志消息中包含 WMQ 原因代码。例如,如果您尝试将消息放入队列并取回 2053 MQRC_Q_FULL,这通常是由快速生产者/慢消费者问题引起的暂时性错误。但是,如果您返回 2035 MQRC_AUTHORIZATION_ERROR,那么如果没有人工干预,程序就不可能恢复。如果记录的消息没有 WMQ 原因代码,则很难确定传输层错误的根本原因。