2017-02-15 72 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()'操作嗎? –