JMS 至 JMS 橋接器

連線能力 > JMS 至 JMS 橋接器

警告,請先嘗試 Camel!

請注意,我們建議您考慮使用 Apache Camel 來橋接 ActiveMQ Classic 與任何訊息代理程式(或者實際上是任何其他技術、協定或中介軟體),因為這樣更容易

例如,在您的 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();
  }

}

Apache、ActiveMQ、Apache ActiveMQ、Apache 羽毛標誌和 Apache ActiveMQ 專案標誌是 The Apache Software Foundation 的商標。版權所有 © 2024,The Apache Software Foundation。根據 Apache License 2.0 授權。