2012-07-11 3 views
0

문제점은 다음과 같습니다. service mix 및 camel routing 사용 activeMQ를 통해 JSON 메시지를 보내고 있습니다. 문제는이 사용자가이 메시지를 처리하는 데 걸리는 시간이 X이므로 메시지를 소비하는 동안 소비자가 중지되거나 중단 될 수 있다는 것입니다. 이 경우 메시지는 절반의 소비자가되며 잘 배달 되었기 때문에 이미 큐에서 삭제됩니다.ServiceMix, Apache ActiveMQ, Camel이 메시지 소비에 "done"을 보냄

소비 될 때 대기열에서 메시지를 제거하지 않고 삭제하기 전에이 메시지 처리가 완료되었다는 소비자의 확인을 기다리는 것이 가능합니까?

파일 시스템의 일반적인 가져 오기 파일에서 파일을 제거하거나 파일의 이름이 바뀌면 파일 이름이 완전히 처리되고 트랜잭션이 완전히 커밋됩니다. 그렇다면 ESB 세계에서 우리는 내가 끝날 때까지 메시지를 지키면서 그것을 제거하라고 말 할 수 있습니다.

저는 현재이 메시지를 사용하기 위해 spring jms : listener-container 및 jms : listener를 사용하고 있습니다.

답변

1

문제는 JMS 트랜잭션이 매일 해결하는 것입니다. ActiveMQ를에서

일부 노트는 here

쉽게 JMS에서 로컬 트랜잭션을 사용할 수 있으며, 설정과 같은 리스너 컨테이너 (sessionTransacted에 진정한 주)에 대해 : 다음

<bean id="myListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> 
    <property name="concurrentConsumers" value="1" /> 
    <property name="connectionFactory" ref="jmsConnectionFactory" /> 
    <property name="destination" ref="myQueue" /> 
    <property name="messageListener" ref="myConsumerBean" /> 
    <property name="sessionTransacted" value="true" /> 
</bean> 

당신이 거래 한 세션. 메시지 수신기가 메시지를 소비하지 않으면 메시지는 대기열로 롤백됩니다. 트랜잭션은 메시지 리스너 bean의 "onMessage"메소드가 성공적으로 리턴하지 않는 한 (예외가 던져지지 않는 한) 커밋하지 않습니다 (= 메시지는 대기열에서 제거됩니다). 이게 니가 원하는 것 같아.