반응형

스프링에서 okhttp3 를 사용중 로그에 다음과 같은 오류 메시지가 떴다.

 

okhttp3 사용 중에 간헐적으로 unexpected end of stream on [주소] 가 나왔다.

 

request 를 요청받는 서버 설정마다 다른 것 같다.

해당 원인은

요청받는 서버의 keep_alive timeout 이 okhttp 로 요청하는 클라이언트 서버보다 timeout 시간이 낫기 떄문이다.

다시 말하면 클라이언트 서버가 timeout 이 받아주는 서버 timout 보다 길다.

 

나의 경우는 Okhttp3 로 요청하고 나서 프로세스가 조금 긴 경우에 다음과 같은 현상이 나왔다.

 

클라이언트가 서버에서 데이터를 받고나서 서버의 keep_alive timeout 시간이 지났음에도 클라이언트에서는 프로세스가 끝나지 않기 때문에 발생한다.

이런 경우 간단하게 해결 방법은 okhttp request 객체에 

addHeader("Connection","close") 

만 추가해주면 됐다.

 

Request request = new Request.Builder()
                .url(requestUrl)
                .addHeader("Connection", "close")
                .get()
                .build();

 

 

 

나의 경우 서버에서 데이터를 받아와서 처리하는데 많은 로직이 있어 처리시간이 짧지 않았고, 프로세스를 처리 하는 도중 요청받는 서버의 keep_alive timeout 시간이 지나 다음 오류를 뱉었다.

데이터를 받아 온 후라 다음 오류가 나도 상관없었지만, 오류를 모니터링 할때 보기 안좋기 때문에 해결해 주었다.

 

예를 들어 keep_alive timeout 이 긴 서버의 경우는 해당 오류가 나지 않을 것이다.

 

참고문헌

github.com/square/okhttp/issues/2738

 

반응형

+ Recent posts