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

C# 调用相同的函数,直到它连接到服务器,c#,exception-handling,ibm-mq,C#,Exception Handling,Ibm Mq,我正在设计一个系统,在这个系统中,我需要继续尝试连接到MQ服务器,直到我得到一个连接 默认情况下,如果MQ不可用,它将出现异常。如何才能一次又一次地调用相同的方法,直到我获得连接。我知道我可以使用递归,有没有更好的方法呢。因为我想避免无限循环。我还想等待进一步的处理,直到我得到连接 我将.NET2.0与C#一起使用。它是窗口服务应用程序 以下是基本结构: while(true) { try { // attempt connection break; // Will on

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

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


我将.NET2.0与C#一起使用。它是窗口服务应用程序

以下是基本结构:

while(true)
{
  try
  {
    // attempt connection
    break; // Will only get here if an exception was not thrown
  }
  catch
  {
    // Logging, sleep statement
  }
}
如果您有任何方法可以确定是否无法建立连接(抛出异常除外),请使用该方法。异常不应用于流控制,我所展示的示例适用于极端情况


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

以下是基本结构:

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);
}
const int尝试次数=3;
常数int=5000;
常数int perTrialSleep=600000;
while(true)
{
对于(变量i=0;i<尝试次数;i++)
{
尝试
{
Connect();
返回;
}
捕获(连接异常)
{
睡眠(睡眠);
}
}
Log();
睡眠(perTrialSleep);
}

在我看来,循环应该是无限的。你想成为因为服务器停机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);
}
const int尝试次数=3;
常数int=5000;
常数int perTrialSleep=600000;
while(true)
{
对于(变量i=0;i<尝试次数;i++)
{
尝试
{
Connect();
返回;
}
捕获(连接异常)
{
睡眠(睡眠);
}
}
Log();
睡眠(perTrialSleep);
}

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

WMQ v7.0中的.Net功能比WMQ v6中的要好得多。在可用的选项中,可以完全在通道配置中处理客户端重新连接。由于v6从2011年9月起已经停止使用,而且这是一个新的应用程序,因此我强烈建议使用WMQ v7客户端。您可以将其与v6 QMgr一起使用,但无法获得所有v7功能。最好您也可以使用v7 QMgr,然后将重新连接行为作为一个可配置选项。如果您现在使用v6,那么您需要在接下来的18个月内升级到v7,如果您希望能够从IBM获得支持的话

IBM-MQC7:WebSphereMQV7.0客户端

假设您将继续编写重新连接逻辑,那么您肯定希望在两次重新连接尝试之间睡眠至少一整秒钟,最好是几秒钟。否则,WMQ侦听器将被淹没,并执行非常有效的拒绝服务攻击


确保在日志消息中包含WMQ原因代码。例如,如果您试图将消息放入队列并返回2053 MQRC_Q_FULL,则通常是由快速生产者/慢速消费者问题引起的暂时错误。但是如果您返回2035 MQRC_AUTHORIZATION_ERROR,则程序不可能在没有人为干预的情况下恢复。如果记录的消息没有WMQ原因代码,则很难确定传输层中错误的根本原因。

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

WMQ v7.0中的.Net功能比WMQ v6中的要好得多。在可用的选项中,可以完全在通道配置中处理客户端重新连接。由于v6从2011年9月起已经停止使用,而且这是一个新的应用程序,因此我强烈建议使用WMQ v7客户端。您可以将其与v6 QMgr一起使用,但无法获得所有v7功能。最好您也可以使用v7 QMgr,然后将重新连接行为作为一个可配置选项。如果您现在使用v6,那么您需要在接下来的18个月内升级到v7,如果您希望能够从IBM获得支持的话

IBM-MQC7:WebSphereMQV7.0客户端

假设您将继续编写重新连接逻辑,那么您肯定希望在两次重新连接尝试之间睡眠至少一整秒钟,最好是几秒钟。否则,WMQ侦听器将被淹没,并执行非常有效的拒绝服务攻击


确保在日志消息中包含WMQ原因代码。例如,如果您试图将消息放入队列并返回2053 MQRC_Q_FULL,则通常是由快速生产者/慢速消费者问题引起的暂时错误。但是如果您返回2035 MQRC_AUTHORIZATION_ERROR,则程序不可能在没有人为干预的情况下恢复。如果记录的消息没有WMQ原因代码,则很难确定传输层中错误的根本原因。

您能提供到目前为止所做工作的示例吗?这有助于澄清问题。如果你不想要一个无限循环,你想要什么?你能提供你迄今为止所做的例子吗?这有助于澄清问题。如果你不想要无限循环,你想要什么?这是你“可以”做的,你是否应该允许无限调用是另一个问题。就我个人而言,我会放一些sl