入站端点确认模式

默认情况下,入站端点使用AUTO确认模式,这意味着当下游集成流完成(或通过使用QueueChannelExecutorChannel将消息传递给另一个线程)时,容器会自动确认消息。将模式设置为NONE会配置使用者,使其根本不使用确认(代理在发送消息后立即自动确认消息)。将模式设置为MANUAL允许用户代码在处理过程中的其他某个点确认消息。为此,在此模式下,端点分别在amqp_channelamqp_deliveryTag标头中提供ChanneldeliveryTag

您可以对Channel执行任何有效的Rabbit命令,但是通常只使用basicAckbasicNack(或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;
}