发布者确认和返回的替代机制
当连接工厂配置了发布者确认和返回功能时,上面的部分讨论了如何配置消息通道来异步接收这些确认和返回。从 5.4 版本开始,引入了一种通常更容易使用的替代机制。
在这种情况下,不要配置 confirm-correlation-expression
或确认和返回通道。而是,在 AmqpHeaders.PUBLISH_CONFIRM_CORRELATION
头部中添加一个 CorrelationData
实例;然后,您可以稍后通过检查您已发送消息所对应的 CorrelationData
实例中 future 的状态来等待结果。returnedMessage
字段在 future 完成之前总是会被填充(如果消息被返回)。
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
并添加任何您需要的额外数据。