发布者确认和返回的备用机制

当连接工厂配置为发布者确认和返回时,以上部分讨论了消息通道的配置以异步接收确认和返回。从 5.4 版开始,有一个通常更易于使用的附加机制。

在这种情况下,请勿配置 confirm-correlation-expression 或确认和返回通道。相反,在 AmqpHeaders.PUBLISH_CONFIRM_CORRELATION 标头中添加一个 CorrelationData 实例;然后,你可以稍后通过检查已发送消息的 CorrelationData 实例中的 future 状态来等待结果。在 future 完成之前,returnedMessage 字段始终会填充(如果返回消息)。

CorrelationData corr = new CorrelationData("someId"); // <--- Unique "id" is required for returns
someFlow.getInputChannel().send(MessageBuilder.withPayload("test")
        .setHeader("rk", "someKeyThatWontRoute")
        .setHeader(AmqpHeaders.PUBLISH_CONFIRM_CORRELATION, corr)
        .build());
...
try {
    Confirm Confirm = corr.getFuture().get(10, TimeUnit.SECONDS);
    Message returned = corr.getReturnedMessage();
    if (returned !- null) {
        // message could not be routed
    }
}
catch { ... }

为了提高性能,你可能希望发送多条消息,然后稍后等待确认,而不是一次发送一条消息。返回的消息是转换后的原始消息;你可以使用任何需要的附加数据对 CorrelationData 进行子类化。