2015-02-02 2 views
2

SimpleMessageListenerContainer를 사용하고 있으며 매 시간마다 큐가 멈추고 unack'd 메시지로 인해 처리되지 않는 문제가있었습니다.unack 된 메시지로 인해 AMQP가 멈추었습니다.

정상적으로 잡히지 않았지만 문제를 추적 할 수없는 오류 때문일 것으로 확신합니다.

승인 모드를 NONE으로 설정했는데 문제가 "수정"되었지만 실제로는 문제가 숨겨졌습니다. 또한 AmqpException을 throw하고 메시지 큐를 다시 대기하려는 경우 확인 모드를 NONE으로 설정하면 작동하지 않습니다.

제 질문은 큐가 멈추는 문제를 어떻게 추적 할 수 있습니까? unack'd 메시지의 페이로드를 볼 수있는 방법이 있습니까? 아니면 승인이 필요하지 않게 할 수있는 승인 모드가 있습니까? 예외가 발생하면 대기열에서 메시지를 대기 시킵니까? 여기

내가 리스너를 등록하고 방법입니다

final SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(); 
container.setConnectionFactory(connectionFactory); 
container.setQueueNames(queueName); 
container.setMessageListener(new MQMessageListenerWrapper(listener)); 
container.setAcknowledgeMode(AcknowledgeMode.NONE); 
container.start(); 

감사합니다.

+0

:-) 내 나쁜 코딩과는 아무런 관련이 없다? –

+0

문제를 재현하기 위해 설정을 공유하면 좋을 것입니다. –

+0

문제는 동일한 메시지를 밀어 넣을 때도 로컬 환경에서 다시 만들 수 없다는 것입니다. 코드 예제로 질문을 업데이트했습니다. – slarge

답변

0

이것은 내 코드 내에서 드물던 경우에만 발생했기 때문에 마침내 추적되는 문제였습니다.

이것은``= "true"로 채널이-거래 봄 AMQP 또는 RabbitMQ 당신이 봤어

1

가장 좋은 추측은 소비자 스레드가 청취자의 어딘가 상류에 매달려 있다는 것입니다. 컨트롤이 컨테이너로 반환되면 메시지는 확인되거나 거부됩니다. thread가 컨테이너에 돌아온다 고해도 unack'd 상태는 남을 수 없습니다.

jstack <pid>을 사용하면 소비자 스레드가 어디에서 붙어 있는지 확인할 수 있습니다.

정확합니다. NONE은 문제를 마스킹하는 중입니다.

1

대기열이 멈추는 경우 특정 대기열에서 수신 대기중인 연결을 살펴보십시오. 같은 대기열에서 수신하는 2 개 (또는 그 이상)의 소비자 스레드로 인해 일종의 데드락 시나리오의 징후 일 수 있습니다. 따라서 토끼에 의해 차단됩니다.

+0

대기열에 추가하는 2 개의 앱과 대기열에서 읽는 2 개의 앱이 있습니다. 교착 상태가 발생하거나 발생할 수있는 방법을 볼 수 없습니다. 나는이 문제가있는 것 같지 않은 다른 응용 프로그램을 가지고 있는데, 그 이유는 내가 볼 수 없으며 인식이 일어나지 않는 예외가있을 수 있다고 생각하는 이유입니다. – slarge

관련 문제