2011-12-31 2 views
8

다음을 수행하는 가장 좋은 방법은 무엇입니까? 실패, 나는 DB 트랜잭션 @MessageDriven 트랜잭션 및 재 전달 의미

  • 를 롤백하고 싶지만 나는 또한 NOT이 재 전달되는 JMS 메시지를 원하는
    • @MessageDriven 빈 데이터베이스에 어떤 작업을 수행, 즉, 재하지 않는다 시험.

    일 수있는 몇 가지 방법을 생각해 볼 수 있습니다. 다른 사람이 있습니까? 그리고 어떤 사람이 최고입니까?

    • 사용 @TransactionManagement(type=BEAN)UserTransaction, 명시 적으로 다시 예외를 잡기 후 굴립니다. 예컨대 :

      catch (Exception e) { e.printStackTrace(); utx.rollback(); }

    • 사용 컨테이너 관리 트랜잭션, onMessage@TransactionAttribute(value=NOT_SUPPORTED)를 지정한 다음 @TransactionAttribute(value=REQUIRED)와 별도의 방법으로 DB 작업을 위임합니다.

    • 트랜잭션 처리 만 남겨두고 서버의 retry 속성을 다시 구성하십시오. 글래스 피쉬 3.1.1을 사용하고 있는데 이것을 설정하는 방법을 정확히 모르겠습니다.

    • 본체를 모두 그대로두고 onMessage 본문에서 메시지를 다시 확인하고 재 배달하면 종료하십시오. (message.getJMSRedelivered()?)

    잘 된 점은 무엇입니까? 이 문제를 해결하기위한 표준/최선의 방법이 있습니까?

  • 답변

    8

    가장 간단하고 휴대용 방법을 사용하면 상태로 onMessage()@TransactionAttribute(value=NOT_SUPPORTED)를 사용하여 작동하지 않습니다이 같은 별도의 방법 접근에주의 @TransactionAttribute(REQUIRES_NEW)

    와 다른 콩에 DB 작업을 이동하는 것입니다. JMS MDB에서 onMessage() 메소드는 @TransactionAttribute을 사용할 수있는 유일한 메소드입니다.

    +1

    감사합니다. 완벽하게 작동했습니다. MDBs의 @TransactionAttribute에 대한 메모가 중요했습니다. 당신 말이 맞아요. 오직 onMessage에만 주석을 달 수 있습니다. 끝에 'onMessage' 주석을 달지 않았지만 로직을'REQUIRES_NEW'가있는 다른 EJB로 옮겼습니다. – wrschneider

    +0

    노트처럼, "필수"로 주석 된 자식 EJB와 함께 작동합니다. – apetrelli

    2

    개인적으로 나는 MDB에서 어떤 일도 결코하지 않지만, (삽입 된) 세션 빈에 즉시 보냅니다.

    이 콩은 DB 작업을 수행합니다. 새로운 트랜잭션을 시작하거나 빈에서 예외를 잡아 로그에 남긴다. (그러나 다시 전달하지 않도록하자.)

    또한 비즈니스 로직을 다른 장소에서 쉽게 재사용 할 수 있다는 이점이 있습니다.