2009-03-08 2 views
1

고객이 전화 할 URL 중 하나에 대해서는 가능한 한 빨리 중단하고 데이터베이스가 다운되거나 느려지더라도 요청을 계속 진행하기를 원합니다. 꽤 빨리 돌아옵니다.웹 응용 프로그램을위한 별도의 스레드에 쓰기

아직 데이터를 처리해야하므로 데이터를 보유하고 별도의 스레드에서 거의 실시간으로 처리하는 별도의 "대기열"이 필요합니다.

이 큐를 작성하기 전에 쉽게 사용할 수있는 클래스/라이브러리가 있는지 묻고 싶습니다.

jboss와 함께 배포되는 자바 웹 앱입니다.

답변

9

J2EE 응용 프로그램에서 고유 한 스레드를 만드는 것은 강력하게 권장되지 않으며 J2EE 사양을 벗어납니다. 나는 당신이 원하는 것을하기 위해 J2EE 라이브러리를 찾지 못할 것이라고 생각한다.

J2EE의 주요 이점 중 하나는 서버가 모든 스레드 (및 기타 자원)를 관리한다는 것입니다. 자신 만의 스레드를 만들기 시작하면 서버는 그 사실을 알지 못하기 때문에이를 보완 할 수 없으므로 다른 두통 중 잠재적 인 리소스 누수 문제가 발생하게됩니다. 문구를 내기 위해 개를 사거나 짖지 마십시오.

JMS을 사용하는 솔루션을 만드는 것이 좋습니다. JMS는 메시지 큐 처리에 관한 것이므로 요구 사항에 잘 맞아야합니다. Here's an article that talks about this a bit.

+0

값 비싼 데이터베이스 쿼리를 수행하는 데 사용할 수있는 스레드를 J2EE 컨테이너에 요청할 수 있습니까? –

+0

컨테이너는 스레드 풀링 및 데이터 세션 풀링을 무료로 제공합니다. 아이디어는 개발자가 이러한 것에 대해 걱정하지 않아야한다는 것입니다. 물론 훌륭한 컨테이너는 광범위한 구성 옵션을 제공합니다. – kgiannakakis

+0

그것이 내가 두려워했던 것이기 때문에, JMS는 내가 쉽게 고쳐야 할 것이라고 생각한 것을 조금 무거워한다고 느낀다. – webclimber

2

JMS 대신 요청을 데이터베이스에 유지 한 다음 스케줄러를 사용하여 요청을 처리 할 수 ​​있습니다. 이 경우 Quartz 또는 Java EE timers을 사용할 수 있습니다.

0

Ajax를 사용하는 완벽한 시나리오가 아닙니까? 긴로드 페이지는 immediatly로 반환되며 긴 처리 요청을 얻기위한 javascript ajax 요청을 포함합니다. 요청이 보류 중일 때 사용자는 회 전자 또는 다른 방법을 통해 요청을 처리하는 데 다소 시간이 걸릴 수 있습니다. 반환 된 후 응답은 자바 스크립트를 통해 페이지에 삽입됩니다.

+0

실제로 사용자가 거기에있을 것이라는 보장은 없으며이 부분은 사용자의 요청과 관련이 없습니다 (최소한 하나는 해당). – webclimber

0

저는 Doug Lea의 PooledExecutor을 사용하여 이런 종류의 작업을 성공적으로 처리했습니다. 요즘 Java 5 이상에서 직접 ExecutorService도 있습니다.

J2EE에서 자신의 스레드를 사용하지 않는 것이 좋습니다. 글쎄, 언제든지 너 자신을 스레딩 할 때 조심해야하고 이것은 전혀 다르지 않다. 서버가 모든 것을 방해하고 J2EE가 취할 수있는 디자인 선택을 제한하는 방식을 좋아하지 않게하는 J2EE 방식을 찾았습니다. 단지 내 50 센트

...

1

사실, 당신은 당신이 commonj를 사용하여 원하는 스레드를 생성 할 수 있습니다. Java EE 컨테이너 내에서 스레드 및 타이머를 사용하는 경량 방법을 제공합니다. 더 많은 정보 here뿐만 아니라이 질문은 여러 번 제기되었습니다.

이렇게하면 Java EE에서 자원 관리의 제한 사항을 확인하고 JMS의 중 복 솔루션 (해당 기능은 작동하지만)을 피할 수 있습니다.

0

구현은 JMS 메시지와 메시지 구동 빈 (Message Driven Beans)으로 끝나고 위대한 규모의 예쁜 sofar를 처리 한 데이터를 처리합니다.

모든 도움말과 의견, 특히 commonj뿐만 아니라 스레드를 수동으로 만드는 방법에 대한 경고를 보내 주시면 감사하겠습니다.

관련 문제