Встраивание брокера ActiveMQ в веб-приложение Spring-MVC Tomcat - PullRequest
6 голосов
/ 18 августа 2010

У меня есть небольшое веб-приложение Spring MVC (в которое встроен 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?) Если есть четкая документация для Разберись с этим, я был бы очень рад, если бы мне на это указали, но мне приходилось браться за вещи, в основном из чрезвычайно полезного BruceBlog . Или любая прямая помощь была бы великолепна.

Спасибо

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

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

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

Ответы [ 2 ]

8 голосов
/ 21 сентября 2010

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

Допущения

  1. Вы подключаетесь к удаленному месту назначения на http://destination -box: 61616
  2. Вы подключитесь к своему локальному брокеру через VM transport , по 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 из конфигурации, так что вы можете использовать одно определение класса и связать его в разные шаблоны для разных очередей.Я только что сделал это для скорости.Просто используйте свои весенние инстинкты:)

1 голос
/ 18 августа 2010

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

...