Я установил 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 для всех очередей? Могу ли я как-то настроить мой слушатель на использование разных фабрик для каждой очереди? Я попытался зарегистрировать фабрику для каждой очереди, а не сгруппировать их, но это тоже не сработало.




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 для объединения сообщений ... Спасибо!