调用相同的函数,直到它连接到服务器

时间:2010-04-18 17:07:06

标签: c# exception-handling ibm-mq

我正在设计一个系统,我需要继续尝试连接到MQ服务器单元,我得到一个连接。

默认情况下,如果MQ不可用,则会出现异常。在获得连接之前,如何一次又一次地调用相同的方法。我知道我可以使用递归,有没有更好的方法来做到这一点。因为我想避免无限循环。我也想等待处理,直到我得到连接。

我在C#中使用.net 2.0。是窗口服务申请书。

3 个答案:

答案 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原因代码,则很难确定传输层中错误的根本原因。