2017-02-15 70 views
0

不要重新排队我有以下配置工作:如果交易失败

@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批处理中有意义吗?

回答

0

不使用外部事务管理器时;回滚交易的重点就是在事务开始之前重新恢复原来的状态。

如果你不使用的交易(或只使用本地事务 - 通过setChannelTransacted(true)并没有事务管理器),你(或ErrorHandler)可以抛出一个AmqpRejectAndDontRequeueException(或设置defaultRequeueRejected假于容器)和消息将去DLQ。

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

在消费方面,确认是事务性的,而不是消息本身的消耗。

所以兔子本身不会重新排队交付,但是,正如你所指出,资源持有者做(但容器将拒绝发货时没有事务管理的2个条件我描述了一个为真) 。

我认为我们需要为您想要的行为提供至少一个选项。我打开了AMQP-711

+0

我明白了,但我怎么能用Spring Batch来做到这一点?我得到这个工作的唯一方法是在发生故障时手动发送到dlq –

+0

在Spring Batch中如何使用侦听器容器,因为它是消息驱动的?一般来说,如果你更完整地解释你的配置会更好。我有一个JIRA的PR,它应该尽快合并。 –

+0

或者你在使用'RabbitTemplate.receive()'操作吗? –