2011-09-11 5 views
1

우리는 하나의 XA 트랜잭션의 일부로 JMS를 읽고 데이터베이스 트랜잭션을 수행하는 응용 프로그램을 가지고 있습니다. 메시지에 몇 가지 문제가있는 것으로 확인되면 데이터베이스를 롤백해야합니다 ( ). 우리는 JMS에서 롤백하여 메시지를 다시 읽지 않게하고 싶습니다. (이전에 롤백이 시작된 경우 MDB가 전체 프로세스를 한 번 더 트리거하지 못하도록합니다.)JMS/MDB 롤백

답변

4

올바르게 이해했는지 확인하기 위해 데이터베이스에서 일부 작업을 수행하는 트랜잭션 메시지 기반 빈이 있습니다. 여전히 MDB가 XA 트랜잭션의 일부가되기를 원하지만 데이터베이스 작업이 MDB가 참여하는 트랜잭션의 상태에 영향을 미치기를 원하지는 않습니다.

즉, 두 가지 해결책이 있습니다. 이미 모두가 같은 트랜잭션 컨텍스트에서 실행 아니라면

  1. MDB를 컨테이너 관리 트랜잭션 내에서 실행되는 경우

    @REQUIRES_NEW 주석 —와 함께 EJB에 모든 데이터베이스 작업을 마무리.
  2. 당신의 MDB가 빈 관리 경우

  3. 는 메시지 전달 트랜잭션의 일부가 아닌, 그래서는 상관없이, 재 전달되지 않습니다 어떤 — EJB 코어 계약 및 요구 사항의 섹션 5.4.12 :

    빈 관리 트랜잭션 구분을 사용하는 메시지 구동 Bean이 javax.transaction을 사용하는 경우. 트랜잭션을 구분하기위한 UserTransaction 인터페이스로 인해 빈이 호출되는 메시지 수신은 트랜잭션의 일부가 아닙니다.