容器和 Broker 命名的佇列
雖然最好使用 AnonymousQueue 例項作為自動刪除佇列,但從版本 2.1 開始,您可以將代理命名佇列與偵聽器容器一起使用。以下示例展示瞭如何實現:
@Bean
public Queue queue() {
return new Queue("", false, true, true);
}
@Bean
public SimpleMessageListenerContainer container() {
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(cf());
container.setQueues(queue());
container.setMessageListener(m -> {
...
});
container.setMissingQueuesFatal(false);
return container;
}
請注意名稱為空的 String。當 RabbitAdmin 宣告佇列時,它會使用代理返回的名稱更新 Queue.actualName 屬性。您必須在配置容器時使用 setQueues() 才能使其正常工作,以便容器可以在執行時訪問宣告的名稱。僅僅設定名稱是不夠的。
| 容器執行時,您不能向其新增代理命名佇列。 |
當連線重置並建立新連線時,新佇列會獲得一個新名稱。由於容器重啟和佇列重新宣告之間存在競態條件,因此將容器的 missingQueuesFatal 屬性設定為 false 很重要,因為容器很可能最初會嘗試重新連線到舊佇列。 |