강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

이종현님의 프로필 이미지
이종현

작성한 질문수

카프카 완벽 가이드 - 코어편

Wakeup을 이용하여 Consumer를 효과적으로 종료하기

mainThread.join() 관련 질문

작성

·

8

·

수정됨

0

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

강의 영상 잘 보고 있습니다! 영상 보다가 궁금한 점이 있어서 질문을 남기게 됐습니다.

JVM에서 정상 종료의 경우는 항상 모든 Shutdown Hook의 실행이 보장되지 않나요? 메인 쓰레드에 대한 join() 호출 없어도 정상 종료의 흐름에서는 wakeup과 JVM 내부에서는 finally 블럭의 consumer.close()의 호출이 보장되지 않나요? 명시적으로 join()을 호출하지 않았을 때 발생할 수 있는 문제 상황이 궁금합니다!

답변 2

1

권 철민님의 프로필 이미지
권 철민
지식공유자

안녕하십니까,

잘 듣고 계시다니, 저도 기분이 좋군요.

mainThread.join()을 사용하지 않을 때 close()가 호출되지 않는 경우가 생길 수 있나요? finally 블럭의 close() 실행은 join()의 호출 없이도 보장되지 않나요? try 구문 내의 코드의 실행을 보장하기 위해서 join()이 필요한 건 이해가 됐습니다!

=> 말씀하신 대로 Java application에서 자연스러운 종료는 exception이 발생하지 않아도 finally block이 수행됩니다. 하지만 main thread가 loop에서 대기하고 있는 상황에서(즉 consumer poll()과 같은) ctrl+c 로 종료를 시킨다던가 하는 경우에는 finally block이 호출되지 않을 수 있습니다.

때문에 이와 같은 상황에서 JVM이 스스로 종료될 때 마지막으로 consumer close등의 리소스 해제 작업을 addShutdownHook()을 사용해서 등록을 시켜 주는 것입니다.

 

감사합니다.

0

안녕하세요, 인프런 AI 인턴입니다. 이종현님.

주신 질문은 Kafka를 사용할 때 JVM 종료 시의 쓰레드 작동에 관한 것입니다. addShutdownHook은 JVM이 종료될 때 등록된 후크 쓰레드를 실행하는데 사용됩니다. 이 과정에서 ‘shutdown hook’의 실행과 ‘메인 스레드 join’의 관계에 대한 이해가 필요하신 것 같습니다.

먼저, addShutdownHook()이란 JVM이 종료될 때 특정한 작업을 수행하기 위해 지정한 코드를 실행하도록 등록하는 방법입니다. 종료 이벤트가 발생시키기 전에 반드시 적절한 정리 작업을 수행하도록 돕습니다.

mainThread.join()의 필요성:
- join() 메서드는 특정 스레드가 끝날 때까지 현재 스레드를 일시 중지시킵니다. 이를 통해 메인 스레드가 모든 작업을 완료한 후에 종료될 수 있게 됩니다.
- wakeup을 호출하여 Kafka Consumer에 대기 중인 poll()을 빠져나오도록 요청할 수 있습니다.
- join()이 없으면, 메인 스레드가 아직 특정 작업을 완료하기 전이라도 프로그램이 종료될 수 있으며, 이는 자원의 올바른 해제를 보장하지 않을 수 있습니다.

즉, mainThread.join()을 사용하지 않으면 예상치 못하게 프로그램이 종료되어 클린업 코드, 예를 들면 consumer의 close()가 호출되지 않을 수 있습니다. 이런 경우 네트워크 연결 등의 리소스가 제대로 해제되지 않아 잠재적인 메모리 누수 등의 문제가 발생할 수 있습니다.

비슷한 질문과 답변이 이미 데이터베이스에 존재하므로 이 기회를 통해 참고 링크를 제공합니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

이종현님의 프로필 이미지
이종현
질문자

mainThread.join()을 사용하지 않을 때 close()가 호출되지 않는 경우가 생길 수 있나요? finally 블럭의 close() 실행은 join()의 호출 없이도 보장되지 않나요? try 구문 내의 코드의 실행을 보장하기 위해서 join()이 필요한 건 이해가 됐습니다!

이종현님의 프로필 이미지
이종현

작성한 질문수

질문하기