JMS 至 JMS 橋接器
警告,請先嘗試 Camel!
請注意,我們建議您考慮使用 Apache Camel 來橋接 ActiveMQ Classic 與任何訊息代理程式(或者實際上是任何其他技術、協定或中介軟體),因為這樣更容易
- 保持彈性;將不同的佇列/主題對應到另一個提供者上的一個或多個佇列或主題非常容易
- 執行基於內容的路由、篩選和其他 企業整合模式
- 讓您可以使用任何技術、協定或中介軟體,而不僅僅是 JMS 提供者
例如,在您的 Spring XML 檔案中只需新增
<camelContext xmlns="http://camel.apache.org/schema/spring"> <route> <from uri="mqseries:Foo.Bar"/> <to uri="activemq:Cheese"/> </route> </camelContext>
簡介
ActiveMQ Classic 提供橋接功能,可連接至其他實作 JMS 1.0.2 及以上規格的 JMS 提供者。 JMS 橋接器可以與 ActiveMQ Classic 代理程式共置,或遠端執行。為了支援 JMS 1.0.2,佇列和主題之間存在區隔。
自動處理入站訊息交換中的臨時目的地和 replyTo 目的地,使 ActiveMQ Classic 服務能夠處理外部 JMS TopicRequestor 或 QueueResquestor 交換。
屬性
JMS 橋接器主題連接器
屬性名稱 | 預設值 | 描述 |
---|---|---|
localTopicConnection | null | 如果設定,將用於連接 ActiveMQ Classic |
localTopicConnectionFactory | null | 如果未設定 localTopicConnection,則用於初始化 ActiveMQ Classic JMS 連線 |
localClientId | null | 設定本機連線的 ID |
outboundClientId | null | 設定輸出連線的 ID |
jndiLocalTemplate | Spring 預設樣板 | 如果未設定 localTopicConnection 或 localTopicConnectionFactory,則用於尋找 ActiveMQ Classic 連線的連線工廠 |
outboundTopicConnection | null | 如果設定,將用於連接外部 JMS 提供者 |
outboundTopicConnectionFactory | null | 如果未設定 outboundTopicConnection,則用於初始化外部 JMS 連線 |
jndiOutboundTemplate | Spring 預設樣板 | 如果未設定 localTopicConnection 或 localTopicConnectionFactory,則用於尋找 ActiveMQ Classic 連線的連線工廠 |
localUsername | null | 如果設定,將用於對 ActiveMQ Classic JMS 提供者進行驗證 |
localPassword | null | 如果設定,將用於對 ActiveMQ Classic JMS 提供者進行驗證 |
outboundUsername | null | 如果設定,將用於對外部 JMS 提供者進行驗證 |
outboundPassword | null | 如果設定,將用於對外部 JMS 提供者進行驗證 |
inboundMessageConvertor | null | 如果設定,將用於將外部 JMS 訊息轉換為 ActiveMQ Classic 的格式 |
outboundMessageConvertor | null | 如果設定,將用於將 ActiveMQ Classic 訊息轉換為外部 JMS 提供者的格式 |
inboundTopicBridges | null | InboundTopicBridge 實例的陣列 - 用於定義來自外部 JMS 提供者的入站(訂閱)流量 |
outboundTopicBridges | null | OutboundTopicBridge 實例的陣列 - 用於定義將發佈到外部 JMS 提供者的目的地 |
JMS 橋接器佇列連接器
屬性名稱 | 預設值 | 描述 |
---|---|---|
localQueueConnection | null | 如果設定,將用於連接 ActiveMQ Classic |
localQueueConnectionFactory | null | 如果未設定 localQueueConnection,則用於初始化 ActiveMQ Classic JMS 連線 |
localClientId | null | 設定本機連線的 ID |
outboundClientId | null | 設定輸出連線的 ID |
jndiLocalTemplate | Spring 預設樣板 | 如果未設定 localQueueConnection 或 localQueueConnectionFactory,則用於尋找 ActiveMQ Classic 連線的連線工廠 |
outboundQueueConnection | null | 如果設定,將用於連接外部 JMS 提供者 |
outboundQueueConnectionFactory | null | 如果未設定 localQueueConnection,則用於初始化外部 JMS 連線 |
jndiOutboundTemplate | Spring 預設樣板 | 如果未設定 localQueueConnection 或 localQueueConnectionFactory,則用於尋找 ActiveMQ Classic 連線的連線工廠 |
localUsername | null | 如果設定,將用於對 ActiveMQ Classic JMS 提供者進行驗證 |
localPassword | null | 如果設定,將用於對 ActiveMQ Classic JMS 提供者進行驗證 |
outboundUsername | null | 如果設定,將用於對外部 JMS 提供者進行驗證 |
outboundPassword | null | 如果設定,將用於對外部 JMS 提供者進行驗證 |
inboundMessageConvertor | null | 如果設定,將用於將外部 JMS 訊息轉換為 ActiveMQ Classic 的格式 |
outboundMessageConvertor | null | 如果設定,將用於將 ActiveMQ Classic 訊息轉換為外部 JMS 提供者的格式 |
inboundQueueBridges | null | InboundQueueBridge 實例的陣列 - 用於定義來自外部 JMS 提供者的入站(訂閱)流量 |
outboundQueueBridges | null | OutboundQueueBridge 實例的陣列 - 用於定義將轉發到外部 JMS 提供者的目的地 |
主題橋接器
InboundTopicBridge
屬性名稱 | 預設值 | 描述 |
---|---|---|
localTopicName | null | 本機 ActiveMQ Classic 佇列的名稱 |
inboundTopicName | null | 要訂閱的外部主題名稱 |
selector | null | 要使用的選取器(如果有的話) |
consumerName | null | 如果設定,將建立持久型消費者 |
OutboundTopicBridge
屬性名稱 | 預設值 | 描述 |
---|---|---|
localTopicName | null | 本機 ActiveMQ Classic 佇列的名稱 |
outboundTopicName | null | 要發佈的外部主題名稱 |
佇列橋接器
InboundQueueBridge
屬性名稱 | 預設值 | 描述 |
---|---|---|
localQueueName | null | 本機 ActiveMQ Classic 佇列的名稱 |
inboundQueueName | null | 要接收訊息的外部佇列名稱 |
selector | null | 要使用的選取器(如果有的話) |
OutboundQueueBridge
屬性名稱 | 預設值 | 描述 |
---|---|---|
localQueueName | null | 本機 ActiveMQ Classic 佇列的名稱 |
outboundQueueName | null | 要傳送訊息的外部佇列名稱 |
XBean 設定範例
以下範例組態檔展示如何使用一般的Xml 設定來設定 JMS 至 JMS 橋接器。
<broker xmlns="https://activemq.dev.org.tw/schema/core" id="localbroker"
brokerName="localBroker" persistent="false">
<jmsBridgeConnectors>
<jmsQueueConnector
outboundQueueConnectionFactory="#remoteFactory">
<inboundQueueBridges>
<inboundQueueBridge
inboundQueueName="org.apache.activemq.network.jms.QueueBridgeXBeanTest" />
</inboundQueueBridges>
</jmsQueueConnector>
</jmsBridgeConnectors>
<transportConnectors>
<transportConnector uri="tcp://127.0.0.1:61234" />
</transportConnectors>
</broker>
<!-- JMS ConnectionFactory to use remote -->
<bean id="remoteFactory"
class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="tcp://127.0.0.1:61666" />
</bean>
純 Spring 設定範例
以下範例展示如何使用原始 Spring XML 來連接代理程式 - 橋接至外部 JMS 提供者
<!-- local broker with embedded Jms to Jms bridge (ok - it's contrived) -->
<bean id="localbroker" class="org.apache.activemq.broker.BrokerService"
init-method="start">
<property name="brokerName" value = "localBroker"/>
<property name="persistent" value = "false"/>
<property name="transportConnectorURIs">
<list>
<value>tcp://127.0.0.1:61234</value>
</list>
</property>
<property name="jmsBridgeConnectors">
<list>
<ref bean="jmsConnector"/>
</list>
</property>
</bean>
<!-- JMS ConnectionFactory to use local broker (the one with the bridge) -->
<bean id="localFactory"
class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="tcp://127.0.0.1:61234" />
</bean>
<!--JmsTopicConnector - the Jms bridge -->
<bean id="jmsConnector"
class="org.apache.activemq.network.jms.JmsTopicConnector">
<property name = "outboundTopicConnectionFactory" ref = "remoteFactory"/>
<property name = "inboundTopicBridges">
<list>
<ref bean="InboundTopicBridge" />
</list>
</property>
</bean>
<bean id ="InboundTopicBridge" class="org.apache.activemq.network.jms.InboundTopicBridge">
<property name = "inboundTopicName" value = "org.apache.activemq.network.jms.TopicBridgeSpringTest"/>
</bean>
將 ActiveMQ Classic 橋接至沒有 URL 設定器的提供者的 XBean 設定範例
某些 JMS 提供者(例如 WebLogic)不會在其 ConnectionFactory 物件上公開連線屬性(例如主機和連接埠 (setBrokerUrl))的設定器。在這種情況下,您需要在 activemq.xml 組態檔中設定 outboundQueueConnectionFactoryName 和 jndiOutboundTemplate。
<!-- START SNIPPET: example -->
<beans>
<!-- Allows us to use system properties as variables in this configuration file -->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"/>
<broker useJmx="true" xmlns="http://activemq.org/config/1.0">
<persistenceAdapter>
<journaledJDBC journalLogFiles="5" dataDirectory="${activemq.home}/activemq-data"/>
</persistenceAdapter>
<transportConnectors>
<transportConnector name="default" uri="tcp://127.0.0.1:61616" discoveryUri="multicast://default"/>
<transportConnector name="stomp" uri="stomp://127.0.0.1:61613"/>
</transportConnectors>
<networkConnectors>
<networkConnector name="default" uri="multicast://default"/>
</networkConnectors>
<jmsBridgeConnectors>
<jmsQueueConnector name="JreportRequestBridge-Inbound"
jndiOutboundTemplate="#remoteJndi"
outboundQueueConnectionFactoryName="jms/ConnectionFactory"
localQueueConnectionFactory="#localFactory">
<inboundQueueBridges>
<inboundQueueBridge inboundQueueName="jms/queue/jreport/request"/>
</inboundQueueBridges>
</jmsQueueConnector>
</jmsBridgeConnectors>
</broker>
<!-- Set up the template for connecting to Weblogic -->
<bean id="remoteJndi" class="org.springframework.jndi.JndiTemplate">
<property name="environment">
<props>
<prop key="java.naming.factory.initial">weblogic.jndi.WLInitialContextFactory</prop>
<prop key="java.naming.provider.url">t3://<your ip here>:7001</prop>
</props>
</property>
</bean>
<bean id="localFactory"
class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="tcp://127.0.0.1:61616" />
</bean>
<bean id="localQueue" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg value="dynamic/jms.queue.jreport.request"/>
</bean>
</beans>
<!-- END SNIPPET: xbean -->
透過橋接器將訊息傳送到外部 ActiveMQ Classic 目的地的純 Spring 設定範例
Spring bean
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="mainBroker" class="org.apache.activemq.broker.BrokerService" init-method="start" destroy-method="stop">
<property name="brokerName" value = "mainBroker"/>
<property name="persistent" value="false"/>
<property name="transportConnectorURIs">
<list>
<value>tcp://127.0.0.1:7000</value>
</list>
</property>
</bean>
<bean id="bridgedBroker" class="org.apache.activemq.broker.BrokerService" init-method="start" destroy-method="stop">
<property name="brokerName" value = "bridgedBroker"/>
<property name="persistent" value="false"/>
<property name="transportConnectorURIs">
<list>
<value>tcp://127.0.0.1:7001</value>
</list>
</property>
<property name="jmsBridgeConnectors">
<list>
<bean class="org.apache.activemq.network.jms.JmsQueueConnector">
<property name="outboundQueueConnectionFactory">
<bean class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="tcp://127.0.0.1:7000" />
</bean>
</property>
<property name="outboundQueueBridges">
<list>
<bean class="org.apache.activemq.network.jms.OutboundQueueBridge">
<constructor-arg value="messages.input"/>
</bean>
</list>
</property>
</bean>
</list>
</property>
</bean>
</beans>
Java 程式碼
public class BridgeTest {
public BridgeTest() throws Exception {
Log log = LogFactory.getLog(getClass());
new ClassPathXmlApplicationContext("bridge/context-bridge.xml");
ActiveMQConnection connection = ActiveMQConnection.makeConnection("tcp://127.0.0.1:7001");
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Destination destination = session.createQueue("messages.input");
MessageProducer producer = session.createProducer(destination);
producer.send(session.createTextMessage("Test Message"));
log.debug("send message");
session.close();
connection.close();
connection = ActiveMQConnection.makeConnection("tcp://127.0.0.1:7000");
connection.start();
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
destination = session.createQueue("messages.input");
MessageConsumer consumer = session.createConsumer(destination);
log.debug("receive message");
Message message = consumer.receive(5000);
log.debug("Received: " + message);
session.close();
connection.close();
}
public static void main(String[] args) throws Exception {
new BridgeTest();
}
}