2013-05-30 2 views
2

현재 프로젝트에 JMS를 구현하려고합니다.JMS 메시지 생성자 및 고객 트랜잭션 관리

메시지 생성자와 메시지 소비자를 두 개의 개별 응용 프로그램으로 만들고 생산과 소비를 두 개의 별도 프로세스 (클라이언트)로 만들고 싶습니다. 하지만 제 요구 사항은 생산자와 소비자간에 트랜잭션 관리를하는 것입니다. 제작자가 100 개의 메시지를 보내고 있고 단일 메시지 전달이 실패하면 전체 100 개의 마사지 배치가 실패했다고 가정 해보십시오.

보낸 메시지의 각 일괄 처리가 별도의 세션에 있으므로 세션을 커밋하거나 롤백 할 수 있기 때문에이 작업을 수행 할 수 있다고 생각합니다. 하지만 내 소비자는 비동기이며 단일 세션에서 실행됩니다.

소비자의 트랜잭션 관리를 어떻게 수행합니까? 나는 그 일괄 처리에서 하나의 메시지 처리 (소비)가 실패 할 경우 위에서 언급 한 100 가지 메시지 일괄 처리를 롤백해야한다.

답변

3

종단 간 승인을 얻으려고하지만 이는 본질적으로 비동기식 인 메시지 대기열과 충돌합니다. 귀하의 고객이 바쁘다면 트랜잭션이 더 오랜 시간 지속될 수 있습니다.

간결하게하기 위해 실제로는 하나의 메시지 만 메시지가 있기 때문에 100 개의 메시지 만 보내지 만 하나의 메시지는 보내지 않습니다.

승인/다시 시도를 구현하기 위해 소비자는 다른 대기열에서 다른 메시지를 되돌릴 수 있습니다. 생산자는 재 시도를 할 수 있고 수신기는 복제물을 버려야합니다.

나는 의무를 분할하려고합니다. 제작자의 책임은 메시징 서버에 메시지를 전달하는 것입니다. 대기열이 가득 차 있는지 확인하는 것은 데이터 센터의 재량권입니다. 그리고 완전히 처리 된 메시지 만 대기열에서 제거됩니다 (JMS 세션 CLIENT_ACKNOWLEDGE를 찾으십시오).

+0

나는 2 단 트랜잭션을 달성하기를 원한다. 엔드 - 투 - 엔드 트랜잭션 관리를 달성하고 싶지 않다. 뭔가가 생산자 측면에서 잘못되면, 메시지 전송 만 롤백해야합니다. 소비자 측에서 문제가 발생하면 소비가 롤백되어야하지만, 배치 원자 레벨에서이를 수행하고 싶습니다. –

+0

다른 해결책이있을 수 있지만 * one * 배치 메시지 만 사용합니다. 그것들은 무엇을 포함하고 크기는 얼마입니까? – Beryllium