简体   繁体   English

Spring AMQP(Rabbit)Listener在发生异常时进入循环

[英]Spring AMQP (Rabbit) Listener goes in a loop in case of exception

@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;
}

Message listener is: 消息监听器是:

public class OperationsListener  implements MessageListener
{
    public static final Logger logger = Logger.getInstance(OperationsListener.class);

    @Autowired (required=true)
    private OperationsProcessor processor;
    @Autowired (required=true)
    private ObjectMapper objectMapper;

    public void onMessage(Message message)
    {
        Jackson2JsonMessageConverter converter = new Jackson2JsonMessageConverter();        
        converter.setJsonObjectMapper(objectMapper);
        OperationsMessage request = (OperationsMessage)converter.fromMessage(message);
        processor.createMessage(request);
        //This is throwing a JPA database exception
        processor.createOperation(request);
    }
}

processor.createOperation() is throwing an exception due to database issue. processor.createOperation()因数据库问题而抛出异常。 Problem is that message listener is going in a loop and message keeps coming back. 问题是消息监听器进入循环并且消息不断回来。

My processor class: 我的处理器类:

@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 throws an exception. opsRepo.create抛出异常。 Even though i am catching error, i was hoping that message doesn't gets sent again by spring amqp. 即使我正在捕捉错误,我希望春天amqp不再发送该消息。 Not sure why same message keeps coming back. 不确定为什么同样的消息不断回来。

EDIT: 编辑:

I think i found some pointers on how to deal with this. 我想我找到了一些关于如何处理这个问题的建议。 The cause is that spring is requeing events upon failure and this is the default nature. 原因是春天在失败时重新发生事件,这是默认的性质。 Found an helpful thread here and here . 在这里这里找到一个有用的线程。

为了确认您找到了什么,这在参考手册“异常处理”一节中明确说明

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM