2013-04-08 3 views
1

참고 : 스칼라로 표현됩니다. BufferedReader을 사용하여 gzip으로 압축 된 HTTP 스트림을 처리하고 각 행을 반복하여 들어오는 데이터를 읽습니다. 문제는 네트워크 I/O 문제로 인해 리셋 연결이있는 경우 (제공자가 때로는 이상한 일을하는 경우) 시간이 초과되기 전에 연결을 최대 15 초 동안 열어 볼 수 있다는 것입니다. 1 초. 어떤 이유로 우리 오피스 제공 업체는 11 시간마다 연결을 재설정합니다.Java BufferedReader의 연결 문제 (및 네트워크 I/O 문제) 잡기?

val connection = getConnection(URL, USER, PASSWORD) 
     val inputStream = connection.getInputStream() 
     val reader = new BufferedReader(new InputStreamReader(new StreamingGZIPInputStream(inputStream), GNIP_CHARSET)) 
     var line = reader.readLine() 
     while(line != null){ 
      parseSupervisor ! ParseThis(line) 
      line = reader.readLine() 
     } 
     throw new ParseStreamCollapseException 

을 여기에 정의 된 getConnection입니다 : 여기

내가 연결을 처리하고있어 방법

private def getConnection(urlString: String, user: String, password: String): HttpURLConnection = { 
    val url = new URL(urlString) 

    val connection = url.openConnection().asInstanceOf[HttpURLConnection] 
    connection.setReadTimeout(1000 * KEEPALIVE_TIMEOUT) 
    connection.setConnectTimeout(1000 * 1) 

    connection.setRequestProperty("Authorization", createAuthHeader(user, password)); 
    connection.setRequestProperty("Accept-Encoding", "gzip") 
    connection 
    } 

는 요약 : HTTP 스트림 라인 별 java.io.BufferedReader을 통해 읽기. 스트림에서 Keep-Alive는 16 초이지만 추가 데이터 손실을 막기 위해 1-2 초 (기본적으로 스트림이 비어 있는지 또는 네트워크 I/O인지 확인)로 범위를 좁히고 싶습니다. 중간에있는 일부 장치는 11 시간마다 연결을 종료하므로 데이터 손실을 최소화하기위한 의미있는 해결 방법이 있으면 좋을 것입니다. HttpURLConnection은 연결시 "종료 신호"를 수신하지 않습니다.

감사합니다.

답변

1

유감스럽게도 연결을 종료하는 네트워크 장치가 연결을 완전히 닫지 않으면 연결이 종료되었다는 알림을받지 못합니다. 그 이유는 응답하는 데 오랜 시간이 걸리는 원격 호스트와 끊어진 연결 간의 차이점을 알 수있는 방법이 없다는 것입니다. 어느쪽으로 든 소켓은 조용합니다.

연결이 끊어 졌다고 가정하면 단절된 연결을 더 신속하게 감지하는 유일한 방법은 제한 시간을 줄이는 것입니다.

+0

젠장, 나는 이것이 사실이라고 생각했다. 나에게 알려 줘서 고마워, 나는 더 용서하는 연결을 위해 우리의 공급자를 정말로 압박해야 할 것이다. – crockpotveggies