發布者確認和回傳的替代機制
當連線工廠設定為發布者確認和回傳時,以上章節討論了訊息通道的組態,以非同步接收確認和回傳。從 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
進行子類別化。