釋出者確認和返回的替代機制

當連線工廠配置了釋出者確認和返回功能時,上面的部分討論瞭如何配置訊息通道來非同步接收這些確認和返回。從 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 並新增任何您需要的額外資料。