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