2011-04-20 4 views
2

특정 들어오는 요청을 처리하는 서블릿이 있습니다. 우리는 이것을`UpdateUserStats '라고 부를 것입니다. 전화가 빠르길 바라지 만 합리적으로 값 비싼 업무를 수행해야한다는 요청이 필요합니다. UpdateUserStats 서블릿이 성공 또는 실패를 결정하는 모든 작업을 수행하고, 새 상태를 유지 한 다음 백그라운드 스레드를 대기열에 추가하고 즉시 성공을 반환하도록 큐에 넣는 것이 좋은 해결책이라고 생각했습니다.Java, Tomcat, ServletContextListener 및 백그라운드 스레드

이것은 좋은 것처럼 보이지만 종료를 처리하는 방법이 궁금합니다. 서버가 종료되면 더 이상 작업이 남아 있지 않을 때까지 백그라운드 스레드가 종료되지 않도록하고 싶습니다. 바람둥이 ServletContextListener를 사용하여 백그라운드 스레드가 서버가 다운되었다는 것을 알았고 대기열이 끝나면 종료하는 방법을 알았습니다. 그러나 이것이 어떻게 동작하는지 100 % 확신하지는 않습니다. 모든 요청이 처리 된 후에 만 ​​contextDestroyed()이됩니까? 인터페이스는 이것을 암시하는 것으로 보이지만 문서에서 찾지 못했습니다. 또한 Tomcat이 배경 스레드가 종료되지 않는다고 화를 내기 전에 얼마나 기다릴 지 궁금합니다.

이 문제를 해결하는 더 좋은 방법이 있습니까? 아마도 Spring이 마술 사후 요청 배경 작업 기능을 가지고 있다면 Spring 애플리케이션이다.

답변

1

. 세션 리스너는해야한다 컨텍스트 청취자보다 먼저 세션 무효화에 대해 통보 받아 응용 프로그램 종료를 알립니다. "

그래서이 스레드는 작업 완료를 알리는 스레드를 처리하는 첫 번째 수신기 여야합니다.

내가 바람둥이를 사용 해본 결과, 청중이 그때까지 끝나지 않으면 깨끗한 종료를 포기하기 전에 10-15 초 이상 기다리지 않을 것입니다.

일반적으로 Spring과 같은 모든 컨테이너는 종료 중에 청취 종료를 위해 청취자를 사용합니다.

1

대안에 대해 언급하면, 별도의 JVM (ActiveMQ, RabbitMQ 또는 더 단순한 것을 사용)에서 대기열을 생성 할 수 있습니다. 이렇게하면 대기열에 들어가도 작업이 중지 되더라도 처리됩니다.

1

최대 스레드 수와 함께 ThreadPool을 사용할 수 있으며, 필요할 때마다 대기하고 하드웨어 및 스레드 작업을 기반으로 구성 할 수 있습니다. 이를 위해 당신은 ExecutorService를 사용해야합니다 http://download.oracle.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html

ThreadPool이 초기화 할 수있는

아래

executorPool = Executors.newFixedThreadPool (50);

서비스 메소드에서 다음과 같이 스레드 제출을 정의 할 수 있습니다. executorPool.submit (새 ProcessTask());

정리/종료 (응용 프로그램) 중에 정리 ThreadPool을 수행 할 수 있습니다. executorPool.shutdownNow();

희망이 도움이 응용 프로그램의 종료에

는 "청취자가 상황에 맞는 청취자에게 통지를 선행 세션 청취자에게 통지 자신의 선언 에 역순으로 통보 서블릿 스펙 문서를 기반으로

관련 문제