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

时间:2017-03-24 21:40:01

标签: java spring rabbitmq spring-amqp

\t

消息监听器是:

@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;
}
由于数据库问题,

processor.createOperation()正在抛出异常。问题是消息监听器进入循环并且消息不断回来。

我的处理器类:

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

opsRepo.create抛出异常。即使我正在捕捉错误,我希望春天amqp不再发送该消息。不确定为什么同样的消息不断回来。

编辑:

我想我找到了一些如何解决这个问题的建议。原因是春天在失败时重新发生事件,这是默认的性质。 找到了有用的帖子herehere

1 个答案:

答案 0 :(得分:3)