2012-11-28 2 views
2

초당 최대 500 개 이상의 메시지를 처리 ​​중입니다. 동시 사용자가 10 명인 SimpleMessageListenerContainer를 사용하여 Spring AMQP + Rabbit에서 데이터가 소비되므로 매 15 시간마다 일부 검사를 수행해야합니다. mins로 설정하고 처리를 위해 특정 속성을 다시로드합니다.이 작업은 15 분마다 발생하는 Quartz 트리거로 수행되고 SimplelistenerContainer를 중지하고 필요한 작업을 수행하고 컨테이너를 다시 시작합니다.Spring AMQP - 중복 메시지

응용 프로그램이 시작될 때 트리거가 실행되고 컨테이너가 다시 시작될 때 모든 것이 완벽하게 작동합니다. 동일한 메시지가 여러 번 전달되는 것을 볼 수 있습니다. 이로 인해 많은 중복이 발생합니다. 소비자가 쏟아내는 예외는 없습니다. 응용 프로그램 시작시

메시지 리스너

class RoundRobinQueueListener implements MessageListener { 

@Override 
public void onMessage(Message message) { //do processing 
    } 

    } 

병렬 소비자를 설정하고 소비자

final SimpleMessageListenerContainer messageListenerContainer = new SimpleMessageListenerContainer(connectionFactory); 
     RoundRobinQueueListener roundRobinListener = RoundRobinQueueListener.class.newInstance(); 
     messageListenerContainer.setQueueNames(queueName); 
     messageListenerContainer.setMessageListener(roundRobinListener); 
     messageListenerContainer.setConcurrentConsumers(10); 
     messageListenerContainer.setChannelTransacted(true); 

석영 트리거를 시작

void execute(JobExecutionContext context) throws JobExecutionException { 
    messageListenerContainer.stop() 
    //Do db task, other processing 
    messageListenerContainer.start() 
    } 
+0

안녕하세요, 우리는 이것을 도와 줄 일부 코드와 구성을보아야 할 것입니다. 관련 Spring 설정은 Quartz 작업 코드뿐만 아니라 시작하기에 좋은 곳이 될 것이다. –

+0

코드 샘플을 추가하기 위해 원래의 질문을 수정했습니다. 코드 구조가 다소 달라졌습니다. – winash

+0

일부 디버깅 결과 스트림 초기화에 버그가 있음을 알게되었고, 토끼를 잘못 비난했습니다. 도움을 주셔서 감사합니다. – winash

답변

0

귀하의 메시지가 이제 소비자에 의해 확인 된 것 같습니다. 자동 확인 모드를 사용하지 않는 경우 사용자가 직접 메시지를 확인해야합니다 (SimpleMessageListenerContainer에서도 구성 할 수 있음). 그렇지 않으면 브로커는 메시지가 성공적으로 처리되지 않았다고 추정하고 메시지를 다시 전달하려고합니다.

+0

설정했습니다. 채널은 트랜잭션이어야하며, 명시 적으로 승인 모드를 설정하지 않았습니다 (기본값은 자동). 수신 확인 문제처럼 보이지만 대기열이 쌓이지 않습니다. 즉 메시지가 처리됩니다. – winash

+0

트랜잭션이 올바르게 커밋 되었습니까? rmq에서 디버그 로깅을 활성화하고 메시지가 대기열에서 제외되는지 확인하십시오. – mbelow

+0

지금 시도해보십시오 – winash

관련 문제