Встраивание в частности, 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. Или любая прямая помощь была бы отличной.
спасибо
обновление. Некоторые исправления:
- Eclipse не находит пространство имен amq должным образом. этой где вы узнаете, почему это сломан, и это легко исправить.
- как говорит Миклос в комментарии ниже, вам нужна организация.OSGi для.core-4.1.0.jar в вашем веб-приложении lib. Получите это из папки ActiveMQ lib/optional.
- вам также нужен Apache Commons xbean-spring-3.4.сосуд. Получить его здесь.
- этой руководство меня через несколько препятствий. Это идеально, за исключением нескольких мест, где имена атрибутов неверны (brokername должен быть brokerName, и physicalname должно быть physicalName).
обновление 2. Я ответил правильно, внизу. Не нужно ничего из этого amq!
2 ответов
вот как это сделать.
предположения
- вы подключаетесь к удаленному пункту назначения на http://destination-box:61616
- вы подключитесь к местному брокеру через VM транспорт, on vm: / / localhost: 7001
- у вас есть две удаленные очереди, которые вы хотите соединить с: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