2011-03-23 4 views
5

Tomcat에 배포 된 웹 응용 프로그램에서 작업하고 있습니다. 우리는 Spring, Hibernate, GWT를 클라이언트 측에서 사용하고있다).Tomcat에 배포 된 웹 응용 프로그램 스레드 만들기

이 응용 프로그램의 기능 중 하나는 엔티티를 생성, 업데이트 또는 삭제할 때 사용자에게 경고 (전자 메일)를 보내는 것입니다. (사용자가 즉시 알리미를 추가 할 수 있으므로 이메일 처리 여부를 결정할 때 처리가 필요합니다.)

알림 메커니즘은 이상적으로 비동기 적이어야하며 CRUD 작업의 성능에 영향을 주어야합니다.

내 마음에 들어온 첫 번째 것은 스레드를 만들고 차단 대기열을 만드는 것입니다. 스레드는 폴링 블로킹 대기열에 계속 이벤트가 있는지 확인합니다. 그러나 웹 응용 프로그램에서 스레드를 만드는 것은 많은 컨테이너에서 권장하지 않는 것입니다.

누군가가 조언/제안 할 수 있습니까? 올바른 방법입니까? 또는 같은 일을하는 더 좋은 방법이 있습니다.

모든 포인터는 높이 평가 될 것입니다. 사전에

감사합니다, Sachin

+0

그냥 돈 여러분의 빈에

<task:annotation-driven executor="asyncExecutor" mode="aspectj"/> <task:executor id="asyncExecutor" pool-size="${executor.poolSize}"/> 

쓰레드를 데몬 쓰레드로 표시하는 것을 잊지 않아서 Tomcat이 완전히 종료되는 것을 멈추지 않습니다. – Daniel

답변

7

컨테이너에 스레드를 만드는 것에 대한 제한은 경험이 부족한 개발자가 발에서 스스로를 쏘지 않도록하기위한 제안이었습니다. 실제로 컨테이너가 이것을 금지합니다. java.util.concurrent 클래스를 사용하면 스레드를 만드는 데 오류가 발생하지 않아야하며이 제한 사항에 대해 너무 걱정하지 않아도됩니다.

요구 사항이 간단하면 ServletContextListener에서 단일 스레드/실행 파일을 만드는 것만으로도 충분합니다. 만들고 스레드를 contextInitialized() 시작하고 contextDestroyed() 종료하십시오. . Executors.newSingleThreadScheduledExecutor()으로 작성된 ScheduledExecutorService을 사용하십시오. 실행기에 전달한 Runnable은 BlockingQueue에서 읽습니다.

요구 사항이 변경되어 더 복잡한 것이 필요한 경우 JMS/MDB 또는 Quartz와 같은 스케줄러를보고 싶을 것입니다.

+0

답장을 보내 주셔서 감사합니다. – Sachin

+1

경험이 거의없는 개발자에게만 제공되는 것은 아닙니다. 요점은 리소스를 관리하도록 설계된 환경 내에서 관리되지 않는 리소스의 사용을 방해하는 것입니다. 웹 컨테이너에는 허용되지만이 환경에서 더 잘 작동하는 관리되는 스레드를 제공 할 수있는 방법이 있습니다. 부수적으로, EJB 컨테이너는 그것을 허용하지 않는다. – Robin

+0

이 예제를 참조하십시오 : http://java-by-ash.blogspot.com/2012/07/threads-in-java-web-application.html – ThreaT

1

당신은 정기적으로 작업을 실행하거나 당신을 위해 대기열 폴링을 수행하는 컨테이너에 의해 실행되는 메시지 구동 콩 (some documentation on JMS and Spring)의 봄 상당을 사용하는 스케줄러를 사용할 수 있습니다.

+0

빠른 답장을 보내 주신 Thomas 께 감사드립니다.우리는 AOP를 사용하여 성공적인 서비스 완료시 모든 서비스 레벨 CRUD 호출을 가로 채고 ArrayBlockingQueue에서 업데이트 할 것을 고려하고 있습니다. 스케줄러를 사용하면 모든 서비스 레벨 CRUD 호출을 가로채는 Aspect가 스케줄러에게 어떻게 알 수 있습니까? 그리고 MDB에 상응하는 스프링에 대한 자세한 내용 (링크 등)을 제공해 주실 수 있습니까? 다시 한번 감사드립니다 – Sachin

+0

음, 이미 링크를 추가했는데, 체크 아웃 했습니까? 스케줄러에 관해서는 정기적으로 (1 분 간격으로 말하면) 실행해야하며 보류중인 경고를 확인하고이를 보냅니다. 이러한 스케줄러 중 하나는 [Quartz] (http://www.quartz-scheduler.org/)입니다. – Thomas

+0

감사합니다 톤 Thoman. 귀하의 회신을 진심으로 감사드립니다 ... – Sachin

0

가장 간단한 방법은 관리되지 않는 스레드를 만드는 것 외에 commonj WorkManager을 사용하는 것입니다. 물론 간단한 스레드 경로를 사용할 수 있지만 작업 환경 (링크에 설명 된대로)에는 단점이 있습니다.

1

Spring 3.x 비동기 메서드 호출을 사용해 볼 수 있습니다. 발신자 방법은 즉시 반환하고 실제 실행은 비동기

의 ApplicationContext 발생합니다

@Async 
public void sendEmail(...) { 
// ... 
} 

자세한 내용은 봄 문서를 참조하십시오 : Spring 3.x Task Execution and Scheduling