2010-01-15 2 views
2

서버 시작 절차 중에 일부 초기화 데이터에 대한 원격 호스트에 액세스합니다. 불행히도 문제의 원격 호스트는 연결에 무작위로 응답하지 않는 것으로 유명합니다 (이 경우 3 %의 시간이 소요될 수 있음). 결과적으로 연결이 영구적으로 중단되며 (영원히 가능할 수 있음), 서버가 적당한 시간 내에 시작되지 않습니다. 1 시간 전에 매달 렸습니다.응답이없는 원격 호스트로 인한 DoS 처리

연결 제한 시간 :

HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
conn.setConnectTimeout(connectionTimeout); 

for (int i = 0; i <= connectionRetries; i++) { 
    try { 
    log.info("Establishing connection to ClassNotes service."); 
    conn.connect(); 
    break; 
    } catch (SocketTimeoutException e) { 
    log.warn("Timed out connecting to ClassNotes service."); 
    } 
} 

그것을 끊으면 연결이 이미 서버에 설치되어 있기 때문에, 작동하지 않습니다. 문제는 서버에서 InputStream을 가져 오려고 할 때 발생합니다.

불만스러운 서비스로 작업해야하는 사람이라면 InputStream을 유한 한 횟수의 재 시도로 스레드하고 JVM의 메모리에 무기한으로 매달려있는 하나 또는 두 개의 잠재적 인 스레드를 처리해야합니까? 아니면 Java에서 이것을 처리하는 더 일반적인 방법이 있습니까?

이 시작되지 않는 서버가이 아닌 원격 호스트의 정보가 서버가 전혀 시작되지 않는 것만 큼 끔찍하지 않음을 아는 것도 유용 할 수 있습니다.

미리 감사드립니다.

답변

2

연결 시간 제한 외에도 setReadTimeout() 수 있습니다.

+0

D' oh! 어떻게 내가 그 API 방법을 놓쳤는 지 모르겠다. 나는 이것이 스레딩에 의지하기 전에 논리적 인 단계라고 생각한다. 감사! –

1

이 논리를 Runnable 객체에 넣은 다음 서비스에 접속하는 스레드를 생성 할 수 있습니다. 스레드가 지정된 시간 내에 완료되지 않은 경우 스레드를 종료하고 다시 시도하십시오. 작동 할 때까지 또는 다시 시도 한계에 도달 할 때까지이 작업을 수행 한 다음 시작과 함께 계속하십시오.

+0

감사합니다. Kaleb. setReadTimeout()이 작동하는지 여부에 따라 이것에 의존해야 할 수도 있습니다. –

+0

아아, setReadTimeout에 대한 모든 것을 잊어 버렸습니다! 전에도 클라이언트 프로젝트에서 사용했습니다. –

관련 문제