2009-02-05 6 views
7

JMS 메시지를 보내는 프로세스가 있습니다. 프로세스가 트랜잭션의 일부입니다. 트랜잭션의 나중 부분이 실패한 경우, 메시지를 보낸 이전 파트 이후의 파트는 메시지를 취소해야합니다. 내가 생각한 한 가지 생각은 메시지에 일정 시간 동안 집어 들지 않아야한다는 것을 어떻게 든 설정하고, 롤백해야한다면 메시지를 취소 할 수있었습니다. 메시징을 알지 못해서, 그 아이디어가 가능한지 나는 모른다. 또는 더 좋은 아이디어가 있습니까? 감사합니다.JMS 롤백

답변

7

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

이것은 무엇을 의미합니까? 트랜잭션이 실패하거나 롤백되면 "보낸"메시지가 꺼지지 않고 "수신 된"메시지가 실제로 소비되지 않습니다. 모두 JMS 및 JTA 공급자가 처리합니다.

JTA를 지원하는 JMS 구현을 사용해야합니다. 이미 거래를 사용하고있는 것처럼 들리므로 일부 구성을 수행하여 문제를 해결할 수 있습니다 (손을 적극적으로 흔들며 ...).

나는 이것을 사용해 본 경험이있다. (BEA WebLogic 7 (BEA WebLogic Integration 포함)). 광고 된대로 작업 - "외부 세계"는 트랜잭션이 성공적으로 커밋되지 않은 한 JMS에 영향을주지 않았습니다.

8

설명하신 내용은 XA 트랜잭션입니다. 이를 통해 트랜잭션은 여러 계층, 즉 JMS 제공자, DB 또는 다른 EIS의 범위를 지정할 수 있습니다. 대부분의 컨테이너는 비 XA 및 비 XA 트랜잭션을 모두 사용하도록 구성 할 수 있으므로 컨테이너 설정을 확인하십시오!

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

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

행운을 빈다.

+0

또한 계정의 성능 오버 헤드를 고려 : http://stackoverflow.com/questions/12305900/performance-overhead-of-xa-data-sources-best-practices – Vadzim