我的工作有以下配置:
@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中有意义吗?
答案 0 :(得分:0)
使用外部事务管理器时不;回滚交易的全部目的是让事情恢复到交易开始之前的状态。
如果您不使用交易(或仅使用本地交易 - 通过setChannelTransacted(true)
而没有交易经理),您(或ErrorHandler
)可以抛出AmqpRejectAndDontRequeueException
(或在容器上将defaultRequeueRejected
设置为false),消息将转到DLQ。
我可以看出这是不一致的; RabbitMQ文档说:
在消费方面,确认是交易性的,而不是消费本身的消息。
因此,兔子本身不会对交付进行重新排队,但正如您所指出的那样,资源持有者会这样做(但是当没有事务管理器且我描述的两个条件之一为真时,容器将拒绝交付。)
我认为我们需要为您想要的行为提供至少一个选项。
我打开了AMQP-711。