Встраивание в частности, ActiveMQ брокера весной в MVC веб-приложения в Tomcat

У меня есть небольшой Spring MVC webapp (который встраивает ActiveMQ), который предназначен для работы в локальном Tomcat и надежно отправляет сообщение в очередь на удаленном ActiveMQ.

все это на месте, за исключением "надежно". На данный момент, если удаленный сайт идет вниз, отправка терпит неудачу резко. Мой конфиг:

<!-- Connection setup -->
<bean id="connectionFactory" 
    class="org.apache.activemq.ActiveMQConnectionFactory" 
    p:brokerURL="tcp://backend-server-box:61616" />

<bean id="cachedConnectionFactory" 
    class="org.springframework.jms.connection.CachingConnectionFactory"
    p:targetConnectionFactory-ref="connectionFactory" 
    p:sessionCacheSize="10" />

<!-- Bean that represents the correct destination on the backend server -->
<bean id="backendDestination" class="org.apache.activemq.command.ActiveMQQueue">
    <constructor-arg value="jmsQueueName" />
</bean>

<bean id="backendTemplate" 
    class="org.springframework.jms.core.JmsTemplate"
    p:connectionFactory-ref="cachedConnectionFactory"
    p:defaultDestination-ref="backendDestination" />

<!-- Bean that sends to the correct destination on the backend server -->
<bean id="simpleSender" class="uk.co.mycompany.client.messaging.SimpleSender">
    <property name="jmsTemplate" ref="backendTemplate" />
</bean>

Я думаю, что мне нужен локальный, постоянный брокер, на который указывает connectionFactory (первый Боб, определенный выше), который знает об удаленном брокер (от JMS до JMS bridge?) Если есть четкая документация, чтобы справиться с этим, я был бы очень рад указать на это, но мне пришлось собрать вещи вместе, в основном из чрезвычайно полезного BruceBlog. Или любая прямая помощь была бы отличной.

спасибо

обновление. Некоторые исправления:

  1. Eclipse не находит пространство имен amq должным образом. этой где вы узнаете, почему это сломан, и это легко исправить.
  2. как говорит Миклос в комментарии ниже, вам нужна организация.OSGi для.core-4.1.0.jar в вашем веб-приложении lib. Получите это из папки ActiveMQ lib/optional.
  3. вам также нужен Apache Commons xbean-spring-3.4.сосуд. Получить его здесь.
  4. этой руководство меня через несколько препятствий. Это идеально, за исключением нескольких мест, где имена атрибутов неверны (brokername должен быть brokerName, и physicalname должно быть physicalName).

обновление 2. Я ответил правильно, внизу. Не нужно ничего из этого amq!

2 ответов


вот как это сделать.

предположения

  1. вы подключаетесь к удаленному пункту назначения на http://destination-box:61616
  2. вы подключитесь к местному брокеру через VM транспорт, on vm: / / localhost: 7001
  3. у вас есть две удаленные очереди, которые вы хотите соединить с:queue1 и queue2

Pre: пространства имен

необходимо объявить следующие пространства имен:

xmlns:p="http://www.springframework.org/schema/p"
xmlns:jms="http://www.springframework.org/schema/jms"

1. Создайте локального брокера:

<bean id="bridgedBroker" class="org.apache.activemq.broker.BrokerService"
 init-method="start" destroy-method="stop">
  <property name="brokerName" value="bridgedBroker"/>
  <property name="persistent" value="true"/>
  <property name="transportConnectorURIs"> 
    <value>vm://localhost:7001</value>
  </property>
  <property name="jmsBridgeConnectors">
    <bean class="org.apache.activemq.network.jms.JmsQueueConnector">
      <property name="outboundQueueConnectionFactory">
        <bean class="org.apache.activemq.ActiveMQConnectionFactory">
          <property name="brokerURL" 
           value="failover:(tcp://destination-box:61616)?maxReconnectDelay=10" />
        </bean>
      </property>
      <property name="outboundQueueBridges">
        <list>
          <bean class="org.apache.activemq.network.jms.OutboundQueueBridge">
            <constructor-arg value="queue1"/>
          </bean>
          <bean class="org.apache.activemq.network.jms.OutboundQueueBridge">
            <constructor-arg value="queue2"/>
          </bean>
        </list>
      </property>
    </bean>
  </property>
</bean>

таким образом, вы используете настойчивость, активируемую свойством и URI конфигурации брокера настройки поведения повтора. Вы должны перечислить имя каждой удаленной очереди, к которой вы хотите подключиться, в outboundBridgeQueues список.

2. Создать фабрики соединений брокера

этот подключается к вышеуказанному брокеру:

<bean id="brokerConnectionFactory"
 class="org.apache.activemq.ActiveMQConnectionFactory"
 p:brokerURL="vm://localhost:7001" />

затем оберните его CachingConnectionFactory (почти всегда хорошая идея):

<bean id="cachingBrokerConnectionFactory"
 class="org.springframework.jms.connection.CachingConnectionFactory"
 p:targetConnectionFactory-ref="brokerConnectionFactory"
 p:sessionCacheSize="10" />

3. Создать местные аналоги отдаленных мест

каждый пункт назначения, с которым вы будете говорить, теперь нуждается в локальном представлении:

<bean id="queue1destination" class="org.apache.activemq.command.ActiveMQQueue">
  <constructor-arg value="queue1" />
</bean>

<bean id="queue2destination" class="org.apache.activemq.command.ActiveMQQueue">
  <constructor-arg value="queue2" />
</bean>

4. Создание шаблонов JMS для подключения к локальным компонентам

Я просто сделаю один для queue1 здесь queue2 точно такой же процесс:

<bean id="queue1JMSTemplate"
 class="org.springframework.jms.core.JmsTemplate"
 p:connectionFactory-ref="cachingBrokerConnectionFactory"
 p:defaultDestination-ref="queue1destination" />

5. Используйте шаблон JMS

пример кода:

public class SendToQueue1
{
  @Autowired protected JmsTemplate queue1JMSTemplate; 

  public void sendMessage(final String message) throws JMSException
  {
    queue1JMSTemplate.send(new MessageCreator()
    {
      public Message createMessage(Session session) throws JMSException
      {
        return session.createTextMessage(message);
      }
    });
  }
}

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

Примечание:это не отличный способ подключить класс. Вероятно, вы передадите JMSTemplate из config, чтобы вы могли использовать одно определение класса и проводите его в разные шаблоны для разных очередей. Я сделал это для скорости. Просто используйте свои весенние инстинкты:)


активный сайт MQ Apache дает пример того, как вставить брокера весной:http://activemq.apache.org/spring-support.html и о том, как определить мост JMS:http://activemq.apache.org/jms-to-jms-bridge.html