Задержка исключения - PullRequest
       11

Задержка исключения

1 голос
/ 24 сентября 2008

У меня есть метод, который периодически (например, раз в 10 секунд) пытается подключиться к серверу и прочитать с него некоторые данные. Сервер может быть недоступен все время. Если сервер недоступен, метод вызывает исключение.

Каков наилучший способ реализации метода-обертки, который не выдает исключение, кроме случаев, когда сервер не был доступен хотя бы одну минуту?

Ответы [ 7 ]

7 голосов
/ 24 сентября 2008

Отслеживайте, когда в последний раз вы успешно заходили на сервер. Если сервер выдает исключение, перехватите его и сравните с последним, когда вы достигли сервера. Если это время больше минуты, сбросьте исключение.

3 голосов
/ 24 сентября 2008

в псевдокоде.

//Create Timer
//Start Timer
bool connected = false;

while (!connected)

    try {
        //Connect To DB

        connected = true;
    }
    catch (Exception ex) {
       if (more than 1 minute has passed)
          throw new Exception(ex);
    }

}
1 голос
/ 24 сентября 2008

Помните, что обработка исключений - это просто очень специализированное использование обычной системы возврата. (Для получения дополнительной технической информации прочтите «монады».) Если исключительная ситуация, о которой вы хотите сообщить, не вписывается естественным образом в систему обработки исключений Java, возможно, не подходит использование исключений.

Вы можете отслеживать состояние ошибки обычным способом: сохраняйте переменную состояния, обновляйте ее при необходимости с информацией об успехе / неудаче и отвечайте соответствующим образом при изменении состояния.

1 голос
/ 24 сентября 2008

В идеале вы можете установить тайм-аут при вызове на сервер. В противном случае выполните thread.sleep (600) в блоке catch и попробуйте снова и завершите работу, если второй не вернется.

1 голос
/ 24 сентября 2008

Вам нужно будет записать время, когда вы изначально пытались подключиться к серверу, а затем перехватить исключение. если время обнаружения исключения превышает исходное время + 1 минуту, повторно сгенерируйте исключение. Если нет, повторите попытку.

0 голосов
/ 24 сентября 2008

Вы можете установить логическую переменную для определения успешности подключения к серверу и проверить его в обработчике исключений, например:

class ServerTester : public Object
{
  private bool failing;
  private ServerConnection serverConnection;
  private Time firstFailure;

  public ServerTester(): failing(false)
  {
  }

  public void TestServer() throws ServerException
  {
    try
    {
       serverConnection.Connect();
       failing = false;
    }
    catch (ServerException e)
    {
      if (failing)
      {
        if (Time::GetTime() - firstFailure > 60)
        {
          failing = false;
          throw e;
        }
      }
      else
      {
        firstFailure = Time::GetTime();
        failing = true;
      }
    }
  }
}

Я не знаю, каковы действительные API времени, так как с тех пор, как я в последний раз использовал Java, прошло много времени. Это будет делать то, что вы просите, но что-то в этом не кажется правильным. Опрос об исключениях кажется мне немного задом наперед, но, поскольку вы имеете дело с сервером, я не могу думать о каком-либо другом способе изо всех сил.

0 голосов
/ 24 сентября 2008

У вас может быть счетчик повторных попыток, и если желаемый счетчик (6 в вашем случае) был достигнут, то выдается исключение

int count = 0;

CheckServer(count);

public void CheckServer(count) {
try
{
  // connect to server
}
catch(Exception e)
{
 if(count < MAX_ATTEMPTS) {
    // wait 10 seconds
    CheckServer(count++)
  }
  else {
    throw e;
  }
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...