2010-03-26 2 views
1

안녕하세요 디자인/건축 관련 질문이 있습니다. 내 JSP 페이지 중 하나에서 이메일을 보내고 싶습니다. 나는 약간의 문제가있는 하나의 특별한 문제가있다. 페이지 중 하나에서 거의 동시에 약 50 개의 이메일을 전송해야하는 경우가 있습니다. 백그라운드 스레드가 실제로 전자 메일을 보내는 대기열로 메시지를 보내고 싶습니다. 이 문제를 해결하기위한 적절한 방법은 무엇입니까? 튜토리얼, 예제 코드 또는 톰캣 구성이 필요한 경우 알려 주시기 바랍니다.Tomcat 6 스레드 안전 메일 대기열 (javax.mail. *)

감사합니다,

답변

1

귀하의 솔루션입니다 오히려 소리를하십시오 내부 큐에 메시지를 추가하고 일부 백그라운드 작업을 처리 할 수 ​​있습니다. 여기

유용 할 수있는 몇 가지 포인터 :

  • 당신이 (이 경우는 JMS 보라) 분산 가고 싶어하지 않는 한, 당신의 큐에 대한 BlockingQueue 구현을 사용합니다. 백그라운드 스레드에서 큐에서 메시지가 take() 인 동안 무한 루프를 수행하십시오. 이러한 클래스는 잠재적 인 동시성 문제를 처리합니다.
  • 웹 응용 프로그램이 시작될 때 및 중지 될 때 ServletContextListener을 사용하여 백그라운드 스레드를 설정하십시오.

원시 BlockingQueue을 사용할 때 발생할 수있는 한 가지 문제점은 웹 응용 프로그램이 중지되면 해당 큐의 모든 메시지가 손실된다는 것입니다. 그게 심각한 문제라면 큐에 데이터베이스를 사용하고 notify()을 사용하여 백그라운드 스레드를 깨우면 데이터베이스에서 모든 요청을 처리하는 것이 가장 쉽습니다.

+0

답장을 보내 주셔서 감사합니다. 이것은 매력처럼 작동했습니다. –

+0

한 가지 더 질문합니다. 어떻게 contextListener가 시작한 스레드에 액세스합니까? –

+0

큐 또는 쓰레드 (바람직하게는 쓰레드)에 대한 참조를 정적 변수 또는 'ServletContext'의 속성에 보관하십시오. 또는, Spring과 같은 IoC 컨테이너를 사용하여 응용 프로그램을 빌드하는 경우, 주입을 처리하도록하십시오. – andri