2010-06-09 13 views
2

EJB 메서드가 호출 된 후 비동기 적으로 일부 항목을 실행해야합니다. 이 필요성은 EJB 3.1에서 충족 될 것으로 보이지만, 불행하게도 우리는 아직 존재하지 않으며 3.0 버전을 사용해야합니다.EJB 및 비동기 처리

가장 간단한 방법으로 무엇을 제안하겠습니까? 나는 다음과 같은 방법을 생각할 수있다 (어쩌면 과잉)

  • JMS
  • TimerService를 (아주 간단 보인다)
  • 봄 된 TaskExecutor (이 어떻게 구성되어 있는지)

이것은에서 일을 할 필요가 단일 웹 로직 서버. 거대한 부하 나 거대한 병렬 처리가 없기 때문에 간단하고 간단하게 처리 할 수 ​​있습니다.

답변

2

먼저 비동기식 작업을 처리할지 여부를 결정해야합니다. 즉, 일반적인 EJB 메소드 트랜잭션이 실패하면 비동기식 작업이 계속 실행됩니다.

JMS 및 TimerService은 트랜잭션입니다. 봄 TaskExecutor, 아마되지 않습니다 (나는 그것을 두 번 확인해야합니다).

Timer을 사용하면 EJB 메소드가 반환 된 후에 비동기식 객체가 즉시 백그라운드에서 실행되도록 (심지어 0으로) 실행을 지연시킬 수 있습니다. 비동기식 작업이 실패하면 타이머 서비스는 몇 번 다시 실행하려고 시도합니다.

JMS를 사용하면 처리 할시기를 엄격하게 제어 할 수 없습니다. 메시지가 보내지면 은 결국이 처리되지만 브로커는 이론적으로는로드를 관리하기위한 처리를 연기 할 수 있습니다.

특정 유스 케이스를 모르겠지만 TimerService인데 부하가 신경 쓰이지 않아도 좋을뿐 아니라 사용하기 쉽습니다.

+0

TimerService가 가장 쉽습니다. 비록 내가 읽은 것에서는 정확성에 대해 많은 보장을하지 못하고 가능한 경우 즉시 프로세스를 시작하는 것이 좋습니다. – yedd

+0

@yedd Glassfish에서 저의 경험으로 만료 된 타이머의 폴링 및 재 배달 간격에 대해 몇 가지 값을 구성 할 수 있습니다. http://docs.sun.com/app/docs/doc/820-7695/beahw?l=en&n = 1 & a =보기. 우리는 1 초의 정확도로이를 구성했으며, 정상적으로 작동했습니다. 나는 weblogic과 비슷한 것이 있다고 생각합니다. 간격을 줄이면 충분히 "즉각적"이 될 수 있습니다. – ewernli

2

WorkManager은 이러한 목적으로 설계되었으며 WebSphere 및 WebLogic에서 기본적으로 지원됩니다. 다른 응용 프로그램 서버에도 다른 구현이 있습니다.

비동기 작업을 수행하면서 서버가 스레드를 관리 할 수 ​​있도록 설계되었습니다.

+0

시도해 볼 수도 있습니다. Spring에는 TaskExecutor 구현이 있습니다. 나는 지금 이식성에 대해 정말로 신경 쓰지 않는다. – yedd