如何將 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 將在建立第一個連線時建立。
您可以將 VM 傳輸上的 create 屬性設定為 false 來關閉自動建立
ActiveMQConnectionFactory cf = new ActiveMQConnectionFactory("vm://127.0.0.1?create=false");