2
@Bean
RabbitTemplate rabbitTemplate() {
RabbitTemplate template = new RabbitTemplate(rabbitConnectionFactory());
template.setMessageConverter(messageConverter);
template.setExchange(amqpProperties.getRabbitMqTopicExchangeName());
return template;
}
@Bean
@Conditional (OperationsCondition.class)
SimpleMessageListenerContainer opsMessageListenerContainer() {
return listenerContainer(amqpProperties.getRabbitMqOperationsQueue(),
amqpProperties.getInitialRabbitOperationsConsumerCount(),
amqpProperties.getMaximumRabbitOperationsConsumerCount(),
opsReceiver());
}
@Bean
@Conditional (OperationsCondition.class)
OperationsListener opsReceiver() {
return new OperationsListener();
}
private SimpleMessageListenerContainer listenerContainer(String queue,
int initConsumers,int maxConsumers, MessageListener listener)
{
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
container.setConnectionFactory(rabbitConnectionFactory());
container.setQueueNames(queue);
container.setMessageListener(listener);
container.setConcurrentConsumers(initConsumers);
container.setMaxConcurrentConsumers(maxConsumers);
container.setMessageConverter(messageConverter);
return container;
}
메시지 리스너가 예외의 경우 루프에 간다. 문제는 메시지 수신기가 루프에 들어가고 메시지가 계속 되돌아 오는 것입니다.봄 AMQP (토끼) 리스너
내 프로세서 클래스 :
@Component
@Transactional (propagation = Propagation.REQUIRES_NEW)
public class OperationsProcessor
{
...............
public void createOperation(OperationsMessage message)
{
try
{
.............
.............
//this call throws exception.
opsRepo.create(operation,null);
}
catch (Exception e)
{
logger.error(e);
}
}
}
opsRepo.create이 예외가 발생합니다. 비록 내가 오류를 잡기는하지만, 나는 메시지가 봄 amqp에 의해 다시 전송되지 않기를 바랬다. 왜 같은 메시지가 계속 되돌아 오는 지 잘 모르겠습니다.
편집 :
나는 내가이 처리하는 방법에 대한 몇 가지 포인터를 찾은 것 같아요. 원인은 봄이 실패하면 사건을 재촉하고 이것이 기본 성격이라는 것입니다. 도움이되는 스레드 here과 here을 찾았습니다.
참. 나는 몇 달 전 전체 문서를 읽은 것 같았다. 나는 중요한 부분을 놓친 것 같아. 링크 주셔서 감사합니다. 리스너에서 예외가 발생하면 AmqpRejectAndDontRequeueException을 던지고 있습니다. 이 방법은 오류가 기록되고 메시지가 다시 시도되지 않습니다. 지금 당장. – Sannu