Spring RabbitListener с RoutingConnectionFactory

Я установил SimpleRoutingConnectionFactory как:

@Bean
@Primary
public SimpleRoutingConnectionFactory routingConnectionFactory(ConnectionFactory cf1, ConnectionFactory cf2) {
    SimpleRoutingConnectionFactory rcf = new SimpleRoutingConnectionFactory();
    Map<Object, ConnectionFactory> map = new HashMap<>();
    map.put("[foo.server1,bar.server1]", cf1); // receive
    map.put("[foo.server2,bar.server2]", cf2); // receive
    map.put("server1", cf1); // send
    map.put("server2", cf2); // send
    rcf.setTargetConnectionFactories(map);
    rcs.setDefaultConnectionFactory(defaultConnectionFactory());
    return rcf;
}

Вышеупомянутый RoutingConnectionFactory позволяет мне отправлять сообщения на определенные серверы, используя SimpleResourceHolder.bind(rabbitTemplate().getConnectionFactory(), host), как и ожидалось, но прием - нет.

Затем я вручную зарегистрировал MessageListenerContainer, который прослушивает очереди foo.server1,bar.server1,foo.server2,bar.server2.

Я ожидал увидеть канал, созданный cf1 для сообщения, которое было отправлено на foo.server1, и канал, созданный cf2 для сообщения, отправленного на bar.server2, но канал, похоже, создается defaultConnectionFactory.

Но в моем журнале DEBUG я вижу: Cannot determine target ConnectionFactory for lookup key [[foo.server1,bar.server1,foo.server2,bar.server2]].

Это значит, что MessageListenerContainer использует один ConnectionFactory для всех очередей? Могу ли я как-то настроить мой слушатель на использование разных фабрик для каждой очереди? Я попытался зарегистрировать фабрику для каждой очереди, а не сгруппировать их, но это тоже не сработало.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
177
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

This means that MessageListenerContainer uses a single ConnectionFactory for all queues?

Это правильно.

Can I somehow configure my listener to use different factory per queue? I tried registering a factory per queue instead of grouping them, but that doesn't work either.

Нет; вам нужен отдельный контейнер для каждой очереди. И вы могли бы также привязать к нему настоящую фабрику соединений, а не использовать фабрику маршрутизации.

Я создам несколько контейнеров и буду использовать MessageChannel для объединения сообщений ... Спасибо!

alturkovic 23.11.2018 17:23

Другие вопросы по теме