Spring AMQP RabbitListener для подключения к 2 кластерам кроликов

У меня есть один метод прослушивателя, помеченный @RabbitListener, в настоящее время он настроен для прослушивания из 1 кластера кроликов. Теперь у меня есть еще один кластер кроликов (cluster2) с тем же ключом очереди / обмена / маршрутизации, и он, возможно, может опубликовать сообщение.

Есть ли способ использовать один и тот же метод слушателя для прослушивания из обоих кластеров? Мне как слушателю все равно, из какого кластера пришло сообщение, и я хотел бы проделать одинаковую обработку для обоих.

    // Config

    @Bean
    @ConfigurationProperties("cluster1.rabbitmq")
    public RabbitProperties rabbitProps() {
        return new RabbitProperties();
    }

    // Listener code

    @RabbitListener(id = "My App", bindings = @QueueBinding(value = @Queue(value = "Some_Queue_Name"), 
            exchange = @Exchange(value = "Some_Exchange_Name"), 
            key = "Some_Routing_Key"))
    public void onMessage(final Message message) {
        // ....
    }

В моем application.yml определены следующие конфигурации

cluster1.rabbitmq.host
cluster1.rabbitmq.username
cluster1.rabbitmq.password

person opuser1    schedule 14.05.2020    source источник


Ответы (1)


Создайте две фабрики контейнеров-слушателей и добавьте второй @RabbitListener в метод

@RabbitListener(id = "My App 1", 
            bindings = @QueueBinding(value = @Queue(value = "Some_Queue_Name"), 
            exchange = @Exchange(value = "Some_Exchange_Name"), 
            key = "Some_Routing_Key"))
@RabbitListener(id = "My App 2", containerFactory="secondContainerFactory"
            bindings = @QueueBinding(value = @Queue(value = "Some_Queue_Name"), 
            exchange = @Exchange(value = "Some_Exchange_Name"), 
            key = "Some_Routing_Key"))
public void onMessage(final Message message) {
    // ....
}

Первый будет использовать значение по умолчанию rabbitListenerContainerFactory.

person Gary Russell    schedule 14.05.2020
comment
Спасибо. Что касается org.springframework.boot.autoconfigure.amqp.RabbitProperties, похоже, есть свойство с именем addresses. Предполагая, что имена очередей / обмен и учетные данные одинаковы для обоих кластеров, будет ли конечный результат таким же, если я просто настрою оба адреса кластера в этом свойстве? - person opuser1; 26.05.2020
comment
Нет; вы не можете использовать автоматическую конфигурацию загрузки с более чем одной фабрикой соединений. - person Gary Russell; 26.05.2020