tomcat을 사용하기 편한 웹서비스입니다.
오픈 소스이고 아파치 제단에서 apache 웹서버도 지원하고
꾸준한 업데이트(?) 도 하고 있기 때문입니다.
Apache Tomcat® - Welcome!
The Apache Tomcat® software is an open source implementation of the Java Servlet, JavaServer Pages, Java Expression Language and Java WebSocket technologies. The Java Servlet, JavaServer Pages, Java Expression Language and Java WebSocket specifications are
tomcat.apache.org
그래서 많이들 사용하고 기업에서도 비싼 웹서비스 대신 tomcat을 사용하는
경우가 많이 있습니다.
하지만 오픈소스이다 보니 버그를 누군가 발견하면 또 다른 누군가는 해결하기 위해
방법을 찾고 해결해서 해당 코드를 검증하여 릴리즈 하는 과정이 필요합니다.
누구도 버그에 대해 해결하려 하지 않는다면 버그는
버그인 체 계속 사용됩니다.
그래서 대부분 사람들은 소스에서 필요한 부분만 살짝 손봐서 사용합니다.
오늘은 이렇게 살짝 수정해서 사용하는 예를 들어 보겠습니다.
tomcat 종료 시 실행 중인 스케줄이 종료되지 않는 현상이 간혹 발생하였습니다.
해당 스케줄은 스레드로 실행이 되고 있었기 때문에
등록된 스케줄이 많을 경우 tomcat은 이미 종료되었지만 스케줄 프로세스가 남아 있는 현상이 있었습니다.
해당 스케줄을 직접 종료해도 되지만 프로세스가 많을 경우 문제가 될 수 있기 때문에
다음과 같이 코드를 작성했습니다.
public void shutdownScheduler() {
try {
WebApplicationContext context = ContextLoader.getCurrentWebApplicationContext();
Scheduler scheduler = (Scheduler)context.getBean("schedulerFactory");
scheduler.shutdown(true);
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
}
위 코드에서는 context에 설정된 스케줄을 강제 종료하고 1초가 sleep 설정했습니다.
sleep 하는 이유는 다른 스케줄이 바로 실행되는 것을 방지하기 위해서입니다.
테스트를 해 봤을 때 sleep을 주지 않으면 교착 현상이 발생하는 것을 확인했습니다.
그리고 sleep 시간이 길게 설정하면 서비스 실행 시 딜레이가 발생하는 것을 확인했습니다.
위 메서드를 context에 설정하고 테스트해보시면
실행 중인 스케줄이 종료되는 것을 확인할 수 있습니다.