2008-09-23 4 views
1

주기적으로 (예 : 매 10 초마다 한 번) 서버에 연결하고 서버에서 데이터를 읽는 방법이 있습니다. 서버가 항상 사용 가능하지 않을 수도 있습니다. 서버를 사용할 수없는 경우 메서드는 예외를 throw합니다.예외 지연

적어도 1 분 동안 서버를 사용할 수없는 경우를 제외하고 예외를 throw하지 않는 래퍼 메서드를 구현하는 가장 좋은 방법은 무엇입니까?

답변

7

마지막으로 서버에 도달 한 시간을 추적합니다. 서버가 예외를 throw하면 catch하여 마지막으로 서버에 도달 한 시간과 비교하십시오. 그 시간이 1 분 넘으면 예외를 다시 던집니다.

+0

서버가 실제로 예외를 throw하지 않습니다. 클라이언트 코드가 throw됩니다.) 그러나 여전히 대답에 +1을 남겼습니다. –

1

원래 서버에 연결하려고 시도한 시간을 기록한 다음 예외를 잡아야합니다. 예외가 잡히는 시간이 원래 시간 + 1 분보다 길면 예외를 다시 발생시킵니다. 그렇지 않은 경우 다시 시도하십시오.

+0

나는 저격 당했다. – brian

1

이상적으로는 서버 호출시 시간 초과를 설정할 수 있습니다. 실패하면 catch 블록에서 thread.sleep (600)을 수행하고 다시 시도하십시오. 두 번째 것이 반환되지 않으면 실패합니다.

+0

타임 아웃이 너무 마음에 들었습니다. – marcospereira

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를이 무엇인지 모르는, 내가 마지막으로 자바를 사용하기 때문에 그것은 오랜만 때문이다. 이것은 당신이 묻는 것을 할 것입니다, 그러나 그것에 관하여 무언가는 맞지 않는 것처럼 보입니다. 예외에 대한 폴링 (polling)은 약간 뒤로 향하는 것처럼 느껴지지만, 서버를 다루기 때문에 내 머리 꼭대기에서 다른 방법을 생각할 수 없다.

1

예외 처리는 단지 이며 매우 특별한 용도 인 일반적인 "반환"시스템의임을 기억하십시오. (자세한 내용은 "모나드"를 읽어보십시오.) 신호하려는 예외 상황이 자연스럽게 Java의 예외 처리 시스템에 맞지 않으면 예외를 사용하는 것이 적절하지 않을 수 있습니다.

평소와 같이 오류 상태를 추적 할 수 있습니다 : 상태 변수를 유지하고 필요에 따라 성공/실패 정보로 업데이트 한 다음 상태가 변경되면 적절히 응답하십시오.