入站端點確認模式
預設情況下,入站端點使用 AUTO
確認模式,這意味著當下遊整合流完成時(或者透過使用 QueueChannel
或 ExecutorChannel
將訊息傳遞給另一個執行緒時),容器會自動確認訊息。將模式設定為 NONE
會配置消費者,使其完全不使用確認(代理在訊息傳送後立即自動確認)。將模式設定為 MANUAL
允許使用者程式碼在處理過程中的其他某個點確認訊息。為了支援這一點,在這種模式下,端點分別在 amqp_channel
和 amqp_deliveryTag
頭中提供了 Channel
和 deliveryTag
。
您可以在 Channel
上執行任何有效的 Rabbit 命令,但通常只使用 basicAck
和 basicNack
(或 basicReject
)。為了不干擾容器的執行,您不應保留對通道的引用,而應僅在當前訊息的上下文中使用它。
由於 Channel 是對“活”物件的引用,它不能被序列化,如果訊息被持久化,它將丟失。 |
以下示例展示瞭如何使用 MANUAL
確認
@ServiceActivator(inputChannel = "foo", outputChannel = "bar")
public Object handle(@Payload String payload, @Header(AmqpHeaders.CHANNEL) Channel channel,
@Header(AmqpHeaders.DELIVERY_TAG) Long deliveryTag) throws Exception {
// Do some processing
if (allOK) {
channel.basicAck(deliveryTag, false);
// perhaps do some more processing
}
else {
channel.basicNack(deliveryTag, false, true);
}
return someResultForDownStreamProcessing;
}