如果交易失败,请不要重新加班

时间:2017-02-15 13:54:12

标签: rabbitmq spring-batch spring-amqp

我的工作有以下配置:

@Autowired
private ConnectionFactory connectionFactory;

@Bean
Step step() {
    return steps.get("step")
        .<~>chunk(chunkSize)
        .reader(reader())
        .processor(processor())
        .writer(writer())
        .build();
}

@Bean
ItemReader<Person> reader() {
    return new AmqpItemReader<>(amqpTemplate());
}

@Bean
AmqpTemplate amqpTemplate() {
    RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
    rabbitTemplate.setChannelTransacted(true);
    return rabbitTemplate;
}

在事务回滚的情况下,是否可以更改RabbitResourceHolder的行为以不重新排队消息?它在Spring Batch中有意义吗?

1 个答案:

答案 0 :(得分:0)

使用外部事务管理器时不;回滚交易的全部目的是让事情恢复到交易开始之前的状态。

如果您不使用交易(或仅使用本地交易 - 通过setChannelTransacted(true)而没有交易经理),您(或ErrorHandler)可以抛出AmqpRejectAndDontRequeueException (或在容器上将defaultRequeueRejected设置为false),消息将转到DLQ。

我可以看出这是不一致的; RabbitMQ文档说:

  

在消费方面,确认是交易性的,而不是消费本身的消息。

因此,兔子本身不会对交付进行重新排队,但正如您所指出的那样,资源持有者会这样做(但是当没有事务管理器且我描述的两个条件之一为真时,容器将拒绝交付。)

我认为我们需要为您想要的行为提供至少一个选项。

我打开了AMQP-711