issue: 동기적 메서드가 비동기적으로 작동하는 경우
import javax.mail.Transport;
for(int i =0; i<3; i++) {
try {
Transport.send(msg);
responseCode = Constants.CODE_OK;
break;
} catch(Exception e) {
logger.log(i < 2 ? Level.WARNING : Level.SEVERE,String.format("error AccessTokenExpiredException : %s", e.getMessage()),e);
responseCode = Constants.CODE_INTERNAL_ERROR;
}
}
동기적으로 작동하는 자바 메서드에서 계속해서 비동기적으로 작동하는 모습이 발견되었다.
디버깅을 진행해보니 for문, 그리고 try, catch문이 문제였다.
Transport.send();
메서드는 기본적으로 동기적으로 작동하고 네트워크 상황 또는 외부 서버상황으로 작동이 원활하지 않은 경우 Block
이 발생한다.
문제는 이부분에서 try, catch
를 함께 사용해서 문제가 되었다.
위 코드와 같이 사용하는 경우 Transport.send()
가 동기적으로 작동하면서 Block
이 발생하는 경우, exception
으로 분류 되어 catch
문으로 프로세스가 진행되어 마치 메서드가 비동기적으로 작동하는 것 처럼 보였다.
위 판단은 완전히 잘못되었었다. 좀 더 구글링하고 공부를 한 결과
Block된다고 exception으로 빠지지 않는다는것을 알게되었다.
오히려 Blocking이 발생함으로써 더욱 동기적으로 작동한다.
그렇다면 원인은 무엇일까 하고 좀 더 찾아본 결과...
javax.mail api 버그로 판단되었다.
(참고 자료:https://github.com/bbottema/simple-java-mail/issues/198)
버전업 결과 해당 이슈는 해결되었고, 결국 패키지 버그인 걸로 결론났다. 이런 형태의 버그는 원인을 파악하기 힘들어 꽤나 고생했다.
버그의 원인을 찾을때 외부 요인을 철저히 통제하고 로그를 찍어 테스트 해야할 듯 하다.