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