Spring 支援

連線能力 > 容器 > Spring 支援

我們完全支援 Spring 來設定 JMS 客戶端以及設定 JMS 訊息代理程式。
這裡有一篇關於使用 Spring 和 ActiveMQ Classic 的很棒的文章,我建議您先閱讀它。

設定 JMS 客戶端

要在 Spring 中設定 ActiveMQ Classic JMS 客戶端,只需在標準的 Spring XML 設定檔中設定 ActiveMQConnectionFactory 的實例即可,就像其他 Bean 一樣。這裡有幾個範例和測試案例可用,而這個範例展示了如何在 Spring 中建構 ActiveMQConnectionFactory,然後將其傳遞到 Spring JmsTemplate 中供一些 POJO 使用。

例如,以下 XML 片段顯示我們正在為 ActiveMQ Classic 建立 JMS 連線工廠,以連線到特定主機名稱和連接埠上的遠端代理程式。

<bean id="jmsFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
  <property name="brokerURL">
    <value>tcp://127.0.0.1:61616</value>
  </property>
</bean>

以下顯示如何使用 Zeroconf 來探索可用的代理程式以進行連線。

<bean id="jmsFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
  <property name="brokerURL">
    <value>zeroconf://_activemq.broker.development.</value>
  </property>
</bean>

從 ActiveMQ Classic 的 1.1 版開始,您也可以使用 JNDI 在 Spring 中設定 ActiveMQ Classic。這個範例顯示如何使用 ActiveMQ Classic 的 JNDI 支援來設定 Spring。

使用 Spring

如果您使用的是 Spring 2.0 的新基於 XML Schema 的設定,您可以將 ActiveMQ Classic 代理程式 XML 嵌入到任何常規 Spring.xml 檔案中,而無需上述工廠 Bean。例如,這是一個 Spring 2.0 中常規 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">

  <amq:broker useJmx="false" persistent="false">
    <amq:transportConnectors>
      <amq:transportConnector uri="tcp://127.0.0.1:0" />
    </amq:transportConnectors>
  </amq:broker>

  <amq:connectionFactory id="jmsFactory" brokerURL="vm://127.0.0.1"/>
</beans>

這允許您設定 JMS 成品(如目的地和連線工廠)以及整個代理程式。

使用 Spring 的 JmsTemplate

Spring 支援一個方便的抽象,JmsTemplate,它允許您在傳送訊息等時隱藏一些較低層級的 JMS 詳細資訊。

請注意,有一些JmsTemplate 的陷阱需要小心。

使用 JmsTemplate 時要記住的一件事是,預設情況下,它會為傳送的每個訊息建立一個新的連線、工作階段、生產者,然後將它們全部關閉。這是非常沒有效率的!這樣做是為了在 EJB 容器中工作,EJB 容器傾向於使用特殊的 ConnectionFactory 來進行集區化。

如果您未使用 JCA 容器來管理 JMS 連線,我們建議您使用我們的集區化 JMS 連線供應商(org.apache.activemq.pool.PooledConnectionFactory),它來自 activemq-pool 程式庫,它將集區化 JMS 資源,以便與 Spring 的 JmsTemplate 或 EJB 有效地工作。

例如:

<!-- a pooling based JMS provider -->
<bean id="jmsFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop">
  <property name="connectionFactory">
    <bean class="org.apache.activemq.ActiveMQConnectionFactory">
      <property name="brokerURL">
        <value>tcp://127.0.0.1:61616</value>
      </property>
    </bean>
  </property>
</bean>

<!-- Spring JMS Template -->
<bean id="myJmsTemplate" class="org.springframework.jms.core.JmsTemplate">
  <property name="connectionFactory">
    <ref local="jmsFactory"/>
  </property>
</bean>

PooledConnectionFactory 支援連線、工作階段和 MessageProducer 實例的集區化,因此它可以與 Camel 和 Spring 的 JmsTemplate 和 MessagListenerContainer 等工具一起使用。連線、工作階段和生產者在使用後會返回到集區,以便它們可以在以後重複使用,而無需承擔再次建立它們的成本。

注意:雖然 PooledConnectionFactory 確實允許建立活動消費者的集合,但它不「集區化」消費者。集區化對於連線、工作階段和生產者來說是有意義的,這些連線、工作階段和生產者可能很少使用,建立成本很高,並且可以以最低的成本保持閒置。另一方面,消費者通常只是在啟動時建立並保持運作,處理傳入的訊息。當消費者完成時,最好關閉它,而不是將其閒置並返回集區以供以後重複使用:這是因為,即使消費者處於閒置狀態,ActiveMQ Classic 也會繼續將訊息傳遞到消費者的預取緩衝區,這些訊息將被擱置在那裡,直到消費者再次啟動。

如果您要建立消費者的集合(例如,用於多執行緒訊息消耗),您應該考慮保持較低的預取值(例如 10 或 20),以確保所有訊息不會最終只發送到其中一個消費者。

我們還有一個用於 JCA/MDB 容器內部的集區化 JMS ConnectionFactory (org.apache.activemq.ra.InboundConnectionProxyFactory),當使用我們的 JCA 資源介面卡時,它將重複使用用於入站訊息的相同 JMS 連線/工作階段。

從 Spring 內部使用 JMS

Spring 的 MessagListenerContainer 應該用於訊息消耗。這提供了 MDB 的所有功能 - 有效率的 JMS 消耗和訊息接聽程式的集區化 - 但無需完整的 EJB 容器。

您可以使用 activemq-pool org.apache.activemq.pool.PooledConnectionFactory 來有效地集區化您的消費者集合的連線和工作階段,或者您可以使用 Spring JMS org.springframework.jms.connection.CachingConnectionFactory 來實現相同的效果。

更多資訊

另請查看以下部落格,了解有關將 Spring JMS 與 ActiveMQ Classic 一起使用的資訊

Apache、ActiveMQ、Apache ActiveMQ、Apache 羽毛標誌和 Apache ActiveMQ 專案標誌是 Apache 軟體基金會的商標。版權所有 © 2024,Apache 軟體基金會。根據 Apache 授權 2.0 授權。