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


1

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

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

7

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

  0

Сервер фактически не генерирует исключение, это код клиента, который бросает;) Однако я все же проголосовал за +1 за ваш ответ. 23 сен. 082008-09-23 21:07:39


1

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

  0

Я был снайпером. 23 сен. 082008-09-23 21:07:00


1

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

  0

Тайм-аут появляется и в моем уме. 24 сен. 082008-09-24 03:38:02


3

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

//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); 
    } 

} 

0

Вы могли бы иметь количество повторов, и если желаемое количество (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; 
    } 
} 
} 

0

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

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. Это будет делать то, что вы просите, но что-то об этом не кажется правильным. Опрос для исключений поражает меня как немного назад, но поскольку вы имеете дело с сервером, я не могу думать ни о каком другом пути.


1

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

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