У меня есть три клиента, каждый со своими экземплярами RabbitMQ, и у меня есть приложение (назовем его appA), у которого есть свой собственный экземпляр RabbitMQ, три клиентских приложения (app1, app2, app3) хотят использовать службу на appA.RabbitMQ RPC через несколько экземпляров rabbitMQ
Служба на appA требует связи RPC, app1, app2 и app3, у каждого из которых есть резервирование. Очередь запросов и очередь резервирования.
С лопатой плагин, я могу направить все booking.request сообщения от app1-3 к APPA:
Shovel1
virtualHost=appA,
name=booking-request-shovel,
sourceURI=amqp://userForApp1:[email protected]/vhostForApp1
queue=booking.request
destinationURI=amqp://userForAppA:[email protected]/vhostForAppA
queue=booking.request
setup another shovel to get booking requests from app2 and app3 to appA in the same way as above.
Теперь Аппа ответит на запрос по очереди booking.response, Мне нужно сообщение ответа на бронирование на rabbitMQ-appA, чтобы вернуться к правильной очереди booking.response либо на app1, app2 или app3, но не на всех из них - как мне настроить очередь с лопатой/федерацией на rabbitMQ-appA, которая будет отправьте ответ обратно на правильный rabbitMQ (app1, app2, app3), который ожидает ответа в своем собственном заказе. ueue?
Все эти приложения используют Spring-amqp (в случае, если это релевантно) В качестве альтернативы, я могу настроить шаблон rabbitMQ весной, который прослушивает несколько очередей rabbitMQ и потребляет от каждого из них.
Из документов, это то, что типичный потребитель выглядит следующим образом:
<rabbit:listener-container connection-factory="rabbitConnectionFactory">
<rabbit:listener queues="some.queue" ref="somePojo" method="handle"/>
</rabbit:listener-container>
Можно указать несколько фабрик соединений, чтобы сделать это, даже если фабрики соединений находятся в одном экземпляре RabbitMQ, но просто разные: виртуальные домены
Update:
На основании ответа Джоша, я бы несколько фабрик соединений:
<rabbit:connection-factory
id="connectionFactory1"
port="${rabbit.port1}"
virtual-host="${rabbit.virtual1}"
host="${rabbit.host1}"
username="${rabbit.username1}"
password="${rabbit.password1}"
connection-factory="nativeConnectionFactory" />
<rabbit:connection-factory
id="connectionFactory2"
port="${rabbit.port2}"
virtual-host="${rabbit.virtual2}"
host="${rabbit.host2}"
username="${rabbit.username2}"
password="${rabbit.password2}"
connection-factory="nativeConnectionFactory" />
Тогда я хотел бы использовать SimpleRoutingConnectionFactory обернуть оба соединения-заводы:
<bean id="connectionFactory" class="org.springframework.amqp.rabbit.connection.SimpleRoutingConnectionFactory">
<property name="targetConnectionFactories">
<map>
<entry key="#{connectionFactory1.virtualHost}" ref="connectionFactory1"/>
<entry key="#{connectionFactory2.virtualHost}" ref="connectionFactory2"/>
</map>
</property>
</bean>
Теперь, когда я декларировать свой шаблон RabbitMQ, Я хотел бы указать его на SimpleRoutingConnectionFactory вместо отдельной фабрики соединений:
<rabbit:template id="template" connection-factory="connectionFactory" />
... а затем использовать темп поздно, как я обычно использую его ...
<rabbit:listener-container
connection-factory="connectionFactory"
channel-transacted="true"
requeue-rejected="true"
concurrency="${rabbit.consumers}">
<rabbit:listener queues="${queue.booking}" ref="TransactionMessageListener" method="handle" />
</rabbit:listener-container>
// и сообщения, потребляемый от обоих RabbitMQ экземпляров
... и ...
@Autowired
private AmqpTemplate template;
template.send(getExchange(), getQueue(), new Message(gson.toJson(message).getBytes(), properties));
// и сообщение публикует в обе очереди
Правильно ли я?
AbstractRoutingConnectionFactory выглядит многообещающим, у вас есть пример того, как вы его используете? Для чего используется параметрCurrentLookupKey? –
Вот весенний документ на нем. [http://docs.spring.io/spring-amqp/docs/1.3.0.M1/reference/html/amqp.html#routing-connection-factory](http://docs.spring.io/spring- AMQP/документы/1.3.0.M1/ссылка/HTML/amqp.html # маршрутизации-соединения-завод). Дайте мне знать, если у вас возникнут вопросы после прочтения этого документа. –
Основываясь на документе, я обновил свой вопрос ... короче говоря, SimpleRoutingConnectionFactory обертывает несколько фабрик подключений и может затем использоваться так же, как и единая фабрика соединений, правильно ли это? –