如何將 Broker 嵌入到連線中

 常見問題 > 使用 Apache ActiveMQ Classic > 如何將 Broker 嵌入到連線中

在許多訊息拓樸中,存在 JMS Broker(伺服器端)和 JMS 客戶端。通常在您的 JVM 內部署一個 broker 是有意義的。這讓您可以最佳化掉網路跳躍;使 JMS 的網路效率與純粹的 RMI 一樣高,但同時具有 JMS 的所有常用特性,例如位置獨立性、可靠性、負載平衡等。

在 ActiveMQ Classic 中嵌入 broker 有多種方法,具體取決於您是使用 Java、Spring、XBean 還是使用 ActiveMQConnectionFactory。

使用顯式 Java 程式碼

以下 Java 程式碼將建立一個嵌入式 broker

BrokerService broker = new BrokerService();

// configure the broker
broker.addConnector("tcp://127.0.0.1:61616");

broker.start();

如果您想在 start() 中延遲綁定傳輸連接器,當 start() 會阻塞等待儲存鎖時(如同在 slave 啟動時),這會很有用,您可以使用以下程式碼

BrokerService broker = new BrokerService();

TransportConnector connector = new TransportConnector();
connector.setUri(new URI("tcp://127.0.0.1:61616"));
broker.addConnector(connector);
broker.start();

在同一個 JVM 中,客戶端可以使用 vm:// 傳輸連線到嵌入式 broker - 而外部客戶端可以使用 tcp:// 協定

如果您有多個嵌入式 broker,請確保您為它們提供唯一的名稱 - 例如

BrokerService broker = new BrokerService();
// configure the broker
broker.setBrokerName("fred");
broker.addConnector("tcp://127.0.0.1:61616");
broker.start();

然後,如果您想從同一個 JVM 中連線到名為「fred」的 broker,您可以使用 URI vm://fred

可以透過應用程式碼完全配置 broker,例如

BrokerService broker = new BrokerService();
broker.setBrokerName("fred");
broker.setUseShutdownHook(false);
//Add plugin
broker.setPlugins(new BrokerPlugin[]{new JaasAuthenticationPlugin()});
//Add a network connection
NetworkConnector connector = answer.addNetworkConnector("static://"+"tcp://somehost:61616");
connector.setDuplex(true);
broker.addConnector("tcp://127.0.0.1:61616");
broker.start();

請注意,您應該在連接器之前新增外掛程式,否則它們將不會被初始化

有關您可以指定的可用屬性的更多詳細資訊,請參閱 BrokerService javadoc

使用 BrokerFactory

有一個名為 BrokerFactory 的輔助類別,可以用來透過 URI 建立 broker 進行設定。

BrokerService broker = BrokerFactory.createBroker(new URI(someURI));

URI 的可用值為

URI 協定 範例 描述
xbean bean:activemq.xml 在類別路徑(和檔案系統)中搜尋具有指定 URI 的 XML 文件(在此案例中為 activemq.xml),然後將其用作 Xml 設定
broker broker:tcp://127.0.0.1:61616 使用 Broker 設定 URI 來設定 broker

使用 Spring

有一個工廠 bean 可以參照外部 ActiveMQ Classic XML 設定檔

<bean id="broker" class="org.apache.activemq.xbean.BrokerFactoryBean">
  <property name="config" value="classpath:org/apache/activemq/xbean/activemq.xml" />
  <property name="start" value="true" />
</bean>

在這種情況下,使用了常用的 Spring classpath:org/apache/activemq/xbean/activemq.xml 資源機制,以便在類別路徑上查找所有目錄,然後查找 org/apache/activemq/xbean/activemq.xml,從而在類別路徑中找到 activemq.xml 檔案。您當然可以將其變更為您喜歡的任何值。例如,如果您只想將其放在類別路徑中的目錄中(例如 Web 應用程式中的 WEB-INF/classes),則可以使用 classpath:activemq.xml

如果您願意,可以使用 file:* 或 *http: 前綴來使用 URL。有關更多詳細資訊,請參閱 Spring 如何處理資源

使用 XBean

如果您已經在使用 XBean,那麼您可以將您的 Spring/XBean XML 設定與 ActiveMQ Classic 的設定混合使用。

<beans 
  xmlns="http://www.springframework.org/schema/beans" 
  xmlns:amq="https://activemq.dev.org.tw/schema/core"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
  https://activemq.dev.org.tw/schema/core https://activemq.dev.org.tw/schema/core/activemq-core.xsd">

  <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"/>

  <broker useJmx="true" xmlns="https://activemq.dev.org.tw/schema/core">

    <persistenceFactory>
      <kahaDB directory="${basedir}/target" />
    </persistenceFactory>

    <transportConnectors>
      <transportConnector uri="tcp://127.0.0.1:61636" />
    </transportConnectors>

  </broker>
</beans>

使用 Spring 2.0

如果您使用的是 Spring 2.0 和 ActiveMQ Classic 4.1 或更高版本(以及 xbean-spring 2.5 或更高版本),您可以將 ActiveMQ Classic broker XML 嵌入到任何常規 Spring.xml 檔案中,而無需上述工廠 bean。例如,這是一個 範例,說明在 Spring 2.0 中也設定了 broker 的常規 Spring XML 檔案。

<beans 
  xmlns="http://www.springframework.org/schema/beans" 
  xmlns:amq="https://activemq.dev.org.tw/schema/core"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
  https://activemq.dev.org.tw/schema/core https://activemq.dev.org.tw/schema/core/activemq-core.xsd">
  
  <!--  lets create an embedded ActiveMQ Classic Broker -->
  <amq:broker useJmx="false" persistent="false">
    <amq:transportConnectors>
      <amq:transportConnector uri="tcp://127.0.0.1:0" />
    </amq:transportConnectors>
  </amq:broker>

   <!--  ActiveMQ Classic destinations to use  -->
  <amq:queue id="destination"  physicalName="org.apache.activemq.spring.Test.spring.embedded"/>

  <!-- JMS ConnectionFactory to use, configuring the embedded broker using XML -->
  <amq:connectionFactory id="jmsFactory" brokerURL="vm://127.0.0.1"/>
  

  <!-- Spring JMS Template -->
  <bean id="myJmsTemplate" class="org.springframework.jms.core.JmsTemplate">
    <property name="connectionFactory">
      <!-- lets wrap in a pool to avoid creating a connection per send -->
      <bean class="org.springframework.jms.connection.SingleConnectionFactory">
        <property name="targetConnectionFactory">
          <ref local="jmsFactory" />
        </property>
      </bean>
    </property>
  </bean>

  <bean id="consumerJmsTemplate" class="org.springframework.jms.core.JmsTemplate">
    <property name="connectionFactory" ref="jmsFactory"/>
  </bean>

  <!-- a sample POJO which uses a Spring JmsTemplate -->
  <bean id="producer" class="org.apache.activemq.spring.SpringProducer">
    <property name="template">
      <ref bean="myJmsTemplate"></ref>
    </property>

    <property name="destination">
      <ref bean="destination" />
    </property>

    <property name="messageCount">
      <value>10</value>
    </property>
  </bean>

  <!-- a sample POJO consumer -->
  <bean id="consumer" class="org.apache.activemq.spring.SpringConsumer">
    <property name="template" ref="consumerJmsTemplate"/>
    <property name="destination" ref="destination"/>
  </bean>

</beans>

使用 ActiveMQConnectionFactory

也可以使用 ActiveMQConnectionFactory 並使用 vm 連接器作為 uri 來建立嵌入式 broker。例如:

ActiveMQConnectionFactory cf = new ActiveMQConnectionFactory("vm://127.0.0.1?broker.persistent=false");

使用查詢參數「broker.」來設定 broker,其中與 BrokerService 上的 bean 屬性相符。

broker 將在建立第一個連線時建立。

您可以將 VM 傳輸上的 create 屬性設定為 false 來關閉自動建立

ActiveMQConnectionFactory cf = new ActiveMQConnectionFactory("vm://127.0.0.1?create=false");

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