회사에서 서버 - 서버로 http 요청을 보내야하는 상황에서 발생한 오류다..
open api 로 ncloud 알림톡 요청하는 로직이있었는데 갑자기 동작하지 않는 것이였다
서버 로그를 확인해보니..
2023-05-03 16:41:09.269 WARN 6552 --- [ ConnectionPool] okhttp3.OkHttpClient :
A connection to https://sens.apigw.ntruss.com/ was leaked.Did you forget to close a response body? To see where this was allocated, set the OkHttpClient logger level to FINE:
Logger.getLogger(OkHttpClient.class.getName()).setLevel(Level.FINE);
위 로그를보니 response body를 close 하지 않은 상황이다.
OkHttp 라이브러리를 통해 통신을 할 때,
OkHttpClient 객체를 생성해서 요청을 보냈다. 이 과정에서 ConnectionPool을 이용하도록 구현되어있기 때문에, connection 자원을 반납하지 않고 계속해서 요청한다면
connection leak 누수가 일어난다고한다.
(연결은 5분 유지라고 한다. 즉, 5분내에 계속 요청을 한다면 자원은 바닥을 찍는다..)
간단하다.
response.close() 코드를 추가하여 해결되었다.
현재 매 요청마다 새로운 OkHttpClient 객체를 생성하고,
요청후 close 하는것으로 코드를 만들었지만
https://hbase.tistory.com/86 참고해보니
그보다는 OkHttpClient를 재사용하는 방법으로 수정하는 것이 더 좋을 것 같다.