참고 : 스칼라로 표현됩니다. 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
은 연결시 "종료 신호"를 수신하지 않습니다.
감사합니다.
젠장, 나는 이것이 사실이라고 생각했다. 나에게 알려 줘서 고마워, 나는 더 용서하는 연결을 위해 우리의 공급자를 정말로 압박해야 할 것이다. – crockpotveggies