1

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

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

我正在使用带有 C# 的 .net 2.0。它是窗口服务应用程序。

4

3 回答 3

3

这是基本结构:

while(true)
{
  try
  {
    // attempt connection
    break; // Will only get here if an exception was not thrown
  }
  catch
  {
    // Logging, sleep statement
  }
}

如果您有任何方法可以确定是否无法建立连接(除了抛出异常),请使用它。异常不应该用于流量控制,我展示的示例是针对极端情况的。

为避免循环无限,您可能需要添加计数(例如,仅尝试 10 次)。

于 2010-04-18T17:09:44.297 回答
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);
}
于 2010-04-18T17:13:41.330 回答
1

已经提供的代码示例将为您提供所需的循环,因此我不会重复该建议。不过,我有几点建议。

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

于 2010-04-23T14:32:53.827 回答