2014-11-03 5 views
1

previous message에서 나는 들어오는 메시지를 병렬로 처리 할 솔루션을 찾고있었습니다. 많은 시행 착오 끝에, 나는 해결책이 될지도 모른다고 생각한다.브로커에서 프로세서의 메시지 손실 다시 시작

그러나 작업중인 플랫폼의 요구 사항 중 하나는 갑작스러운 브로커가 다시 시작될 경우 처리되는 메시지를 "다시 시작"하거나 "다시 대기"해야한다는 것입니다.

테스트하는 동안 메시지 당 작업 단위를 수행하기 위해 한 번에 여러 프로세서를 성공적으로 시작했습니다. 갑자기 브로커를 재시작 할 때 발견 한 사실은 프로세서 내부에서 작동하는 메시지가 실제로 손실된다는 것입니다. 그러나 프로세서가 의도적 인 예외를 throw하면 메시지가 큐에 다시 전달됩니다.

내 메시지가 처리되는 동안 (그리고 작업 단위가 완료되지 않은 경우) 내 메시지를 어떻게 보호 할 수 있습니까? 조언을 주시면 감사하겠습니다.

참고 : 마지막 구현은 tcp로드 밸런서 뒤에있는 두 개의 동일한 브로커의 마스터 - 마스터 설정을 사용합니다.

+0

거래를 사용하고 있으며 문제가되는 메시지가 영구적입니까? –

+0

메시지는 DeliveryMode.PERSISTENT가있는 대기열에 게시됩니다. 내 프로세서에 트랜잭션을 추가하는 방법을 모르겠습니다. 현재 activemq에 대한 Java 프로세스를 종료하면 모든 "in-flight"메시지가 사라집니다. – djBo

+0

방금 ​​각 경로에 트랜잭션을 추가했지만 메시지가 더 이상 병렬로 처리되지 않습니다 ... – djBo

답변

0

메시지를 보존하려면 영구 메시지가있는 트랜잭션을 사용해야합니다. 거래 된 세션이 없으면 모든 예외 시나리오가 다루어지는 것은 아닙니다. 특히 브로커에게 메시지를 소비했음을 알리는 기본 AUTO_ACKNOWLEDGE를 사용하는 경우 메시지가 전달되는 즉시 머리글로 이동하고 삭제하십시오. 그래서 브로커를 다시 시작하면 메시지가 손실됩니다. 이 문제를 해결할 다른 방법은 없습니다.

거래가 제대로 설정되었다고 가정하면 병행 처리가 불가능할 이유가 없습니다. This blog is a bit older now,하지만 당신은 거래를 제대로 설정하고 있는지에 대한 충분한 정보가 아직 충분합니다.

+0

불행히도 AsyncProcessor 인터페이스를 사용하여 일을 할 때 불행하게도 예상대로 작동하지 않습니다. http://camel.apache.org/jms.html에서 나는 asyncConsumer = true가 transacted = true로 설정되면 무시된다는 설정을 읽습니다. Camel 3.0에서 비동기 트랜잭션에 대한 지원을받을 수 있습니다. ( – djBo

+0

별도의 문제입니다. 여기에서 질문에 대한 응답으로 브로커가 트랜잭션을 사용하기 전에 메시지가 완전히 처리되도록하는 유일한 방법은 트랜잭션을 사용하는 것입니다. –

+0

Can not 'CLIENT_ACKNOWLEDGE'를 사용하여 적어도 한 번만 모든 메시지를 전달할 수 있습니까? 배달되지 않은 대신 브로커를 다시 시작하면 재 전달을 받게되지만 소비자가 메시지를 처리 ​​할 수 ​​있다면 메시지 손실을 피할 수 있습니다 ... – Tim

관련 문제