문제

JMS 메시지를 보내는 프로세스가 있습니다. 프로세스는 거래의 일부입니다. 트랜잭션의 후반부가 실패하면, 메시지를 보낸 이전 부분 이후의 부분은 메시지를 취소해야합니다. 내가 생각했던 것은 어떻게 든 일정 시간 동안 수령되지 않아야한다는 메시지를 설정하는 것이었고, 롤백을해야한다면 메시지를 가서 취소 할 수 있습니다. 메시징을 모르면 아이디어가 가능한지 모르겠습니다. 아니면 더 나은 아이디어가 있습니까? 감사

도움이 되었습니까?

해결책

JMS 및 JTA (Java Transaction API)를 함께 사용할 수 있습니다. 여기를 봐. 이를 수행 할 때 JMS 메시지 전송 또는 수신 된 메시지 소비는 실제로 트랜잭션 커밋의 일부로 원자 적으로 발생합니다.

이것은 무엇을 의미 하는가? 트랜잭션에 실패하거나 롤백되면 "전송 된"메시지가 나오지 않으며 "수신 된"메시지는 실제로 소비되지 않습니다. 모두 JMS 및 JTA 제공 업체가 귀하를 위해 처리합니다.

JTA를 지원하는 JMS 구현을 사용해야합니다. 이미 트랜잭션을 사용하고있는 것처럼 들리므로 트랜잭션을 수행하기 위해 일부 구성을 수행하는 것이 문제 일 수 있습니다 (손을 격렬하게 흔들어 ...).

나는 이것 (Bea Weblogic 7 w/ bea weblogic 통합)을 사용한 경험이있었습니다. 광고대로 일했습니다 - "외부 세계"는 거래가 성공적으로 커밋되지 않는 한 내가 시도한 JMS 물건의 영향을 보지 못했습니다.

다른 팁

당신이 설명한 것은 XA 거래입니다. 이를 통해 트랜잭션은 여러 계층 IE JMS 제공 업체, DB 또는 기타 EIS에서 범위를 유지할 수 있습니다. 대부분의 컨테이너는 비 XA 및 없음 XA 트랜잭션을 모두 사용하도록 구성 할 수 있으므로 컨테이너 설정을 확인하십시오!

예를 들어 XA 트랜잭션과 함께 JMS를 사용하는 경우 다음이 가능합니다.

Start Transaction
      |
   DB Insert
      |
   Send JMS Msg
      |
   More DB Inserts
      | 
   Commit Transaction  <- Only at this point will the database records be inserted and the JMS message sent.

XA Tranaction은 전체 Java EE 컨테이너로만 사용할 수 있으므로 Tomcat에서는 XA 트랜잭션을 사용할 수 없습니다.

행운을 빕니다!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top