Конфигурация Spring для нескольких удаленных брокеров Activemq
Как настроить несколько удаленных брокеров activemq (разные IP-адреса) в контексте spring? Ниже приведена конфигурация для 1 удаленного брокера. Я использую camel для создания маршрутов, которые производят и потребляют сообщения от и к различным очередям в нескольких удаленных брокерах. Основываясь на следующих маршрутах, как система знает, к какому удаленному брокеру принадлежит каждая очередь?
-
список пункт
from ("direct:start").to ("activemq:queue:outgoingRequests")
-
элемент списка
from ("activemq:queue:incomingOrders").to ("log: Events? showAll=true").to ("bean:jmsService")
весенний контекст для 1 брокера орг.верблюд.маршруты
<bean id="jmsConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="tcp://10.1.11.97:61616" />
</bean>
<bean id="pooledConnectionFactory"
class="org.apache.activemq.pool.PooledConnectionFactory" init-
method="start" destroy-method="stop">
<property name="maxConnections" value="8" />
<property name="connectionFactory" ref="jmsConnectionFactory" />
</bean>
<bean id="jmsConfig" class="org.apache.camel.component.jms.JmsConfiguration">
<property name="connectionFactory" ref="pooledConnectionFactory"/>
<property name="concurrentConsumers" value="10"/>
</bean>
<bean id="activemq" class="org.apache.activemq.camel.component.ActiveMQComponent">
<property name="configuration" ref="jmsConfig"/>
</bean>
2 ответов
просто добавьте больше компонентов с разными именами
<bean id="activemq" class="org.apache.activemq.camel.component.ActiveMQComponent">
<property name="configuration" ref="jmsConfig"/>
</bean>
<bean id="activemq2" class="org.apache.activemq.camel.component.ActiveMQComponent">
<property name="configuration" ref="myOtherJmsConfig"/>
</bean>
тогда просто используйте имена:
<from uri="activemq:queue:MY.QUEUE"/><!-- get from "1st" ActiveMQ -->
<to uri="activemq2:queue:MY.QUEUE"/> <!-- put to same queue name on other ActiveMQ -->
На самом деле, вы можете называть их как угодно, например "EuropeanMarketBroker" или как угодно.
Я пытался достичь этого с той разницей, что моя конфигурация spring не находится в xml. Полезно знать, что вы можете достичь того же результата, используя весенние аннотации несколькими способами.
ключом к достижению этого является регистрация компонента с требуемым именем. Например:
camelContext.addComponent("activemq2", jmsComponentInstance);
есть два способа достичь этого. А именно, создавая два боба с классификаторами, которые идентифицируют их друг от друга, а затем подключая эти бобы и регистрировать их как компоненты. В качестве альтернативы (это предпочтительнее) вы можете создать компонент и зарегистрировать его сразу. Ниже приведены примеры обоих:
1 - Создать Bean и зарегистрироваться в другом месте
@Configuration
public class ClassA{
@Bean @Qualifier("activemq2") public JmsComponent createJmsComponent(){
return JmsComponent.jmsComponentAutoAcknowledge(..);//Initialise component from externalised configs
}
}
@Component
public class ClassB{
@Autowired private CamelContext camelContext;
@Autowired @Qualifier("activemq2")
private JmsComponent jmsComponent;
public void someMethod(){
camelContext.addComponent("activemq2", jmsComponent);
}
}
2-Создайте Bean и Зарегистрируйтесь в одном месте в вашем @Configuration bean.
@Bean @Autowired public JmsComponent createJmsComponent(CamelContext camelContext){
JmsComponent component = JmsComponent.jmsComponentAutoAcknowledge(..);//Initialise component from externalised configs
camelContext.addComponent("activemq2", component);//Add Component to camel context
return component;//Return component instance
}