Конфигурация 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
}