入站端点确认模式
默认情况下,入站端点使用 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;
}