Spring Boot中文參考指南(2.1.6)34、消息傳遞

下一篇[未完待續]

Spring Boot中文參考指南(2.1.6)34、消息傳遞

<code>英文原文:https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/boot-features-messaging.html/<code>
<code>GitHub:https://github.com/jijicai/Spring/tree/master/spring-boot/<code>

34、消息傳遞

Spring Framework 為與消息傳遞系統的集成提供了廣泛的支持,從使用 JmsTemplate 的 JMS API 的簡化使用到異步接收消息的完整的基礎設施。Spring AMQP 為 Advanced Message Queuing Protocol 提供了類似的功能集。Spring Boot 還為 RabbitTemplate 和 RabbitMQ 提供了自動配置選項。Spring WebSocket 本身就支持 STOMP 消息傳遞,而 Spring Boot 通過啟動器和少量的自動配置來支持這一點。Spring Boot 還支持 Apache Kafka。

34.1、JMS

javax.jms.ConnectionFactory 接口提供了創建 javax.jms.Connection 以與 JMS 代理交互的標準方法。儘管 Spring 需要一個 ConnectionFactory 來處理 JMS,但你通常不需要自己直接使用它,而是可以依賴於更高級別的消息傳遞抽象。(有關詳細信息,請參閱 Spring Framework 參考文檔的相關部分。)Spring Boot 還自動配置發送和接收消息所需的基礎設施。

34.1.1、ActiveMQ 支持

當 ActiveMQ 在類路徑上可用時,Spring Boot 還可以配置 ConnectionFactory。如果存在代理,則會自動啟動並配置嵌入式代理(前提是未通過配置指定代理 URL)。

註釋:如果你使用 spring-boot-starter-activemq,那麼將提供連接或嵌入 ActiveMQ 實例所需的依賴項,與 JMS 集成的 Spring 基礎設施也是如此。

ActiveMQ 配置由 spring.activemq.* 中的外部配置屬性控制。例如,你可以在 application.properties 中聲明以下部分:

Spring Boot中文參考指南(2.1.6)34、消息傳遞

<code>spring.activemq.broker-url=tcp://192.168.1.210:9876
spring.activemq.user=admin
spring.activemq.password=secret/<code>

默認情況下,CachingConnectionFactory 使用合理的設置來包裝本地 ConnectionFactory,你可以通過 spring.jms.* 中的外部配置屬性來控制這些設置:

<code>spring.jms.cache.session-cache-size=5/<code>

如果你希望使用本地池,可以通過向 org.messaginghub:pooled-jms 添加依賴項並相應地配置 JmsPoolConnectionFactory 來實現,如下面示例所示:

Spring Boot中文參考指南(2.1.6)34、消息傳遞

<code>spring.activemq.pool.enabled=true
spring.activemq.pool.max-connections=50/<code>

提示:有關更多支持的選項,請參閱 ActiveMQProperties。你還可以註冊任意數量的 bean,這些 bean 實現 ActiveMQConnectionFactoryCustomizer 以進行更高級的定製。

默認情況下,如果目的地不存在,則 ActiveMQ 創建一個,以便根據它們提供的名稱解析目的地。

34.1.2、Artemis 支持

當 Spring Boot 檢測到類路徑上有 Artemis 可用時,它可以自動配置 ConnectionFactory。如果存在代理,則會自動啟動並配置嵌入式代理(除非已顯式設置模式屬性)。支持的模式是 embedded(如果代理在類路徑上不可用,則顯式說明需要嵌入式代理和會發生錯誤)和 native(使用 netty 傳輸協議連接到代理)。當配置了後者後,Spring Boot 將配置一個 ConnectionFactory,它將使用默認設置連接到本地機器上運行的代理。

註釋:如果使用 spring-boot-starter-artemis,則提供連接到現有 Artemis 實例的必要依賴項,以及與 JMS 集成的 Spring 基礎設施。將 org.apache.activemq:artemis-jms-server 添加到應用程序中可以使用嵌入式模式。

Artemis 配置由 spring.artemis.* 中的外部配置屬性控制。例如,可以在 application.properties 中聲明以下部分:

Spring Boot中文參考指南(2.1.6)34、消息傳遞

<code>spring.artemis.mode=native
spring.artemis.host=192.168.1.210
spring.artemis.port=9876
spring.artemis.user=admin
spring.artemis.password=secret/<code>

嵌入代理時,可以選擇是否要啟用持久性,並列出應提供的目標。可以將它們指定為逗號分隔的列表以使用默認選項創建它們,也可以分別為高級隊列和主題配置定義 org.apache.activemq.artemis.jms.server.config.JMSQueueConfiguration 或 org.apache.activemq.artemis.jms.server.config.TopicConfiguration 類型的 bean。

默認情況下,CachingConnectionFactory 使用合理的設置來包裝本地 ConnectionFactory,你可以通過 spring.jms.* 中的外部配置屬性來控制這些設置:

<code>spring.jms.cache.session-cache-size=5/<code>

如果你希望使用本地池,可以通過向 org.messaginghub:pooled-jms 添加依賴項並相應地配置 JmsPoolConnectionFactory 來實現,如下面示例所示:

Spring Boot中文參考指南(2.1.6)34、消息傳遞

<code>spring.artemis.pool.enabled=true
spring.artemis.pool.max-connections=50/<code>

有關更多支持的選項,請參見 ArtemisProperties。(https://github.com/spring-projects/spring-boot/tree/v2.1.6.RELEASE/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/artemis/ArtemisProperties.java )

使用 Artemis 配置中的 name 屬性或通過配置提供的名稱,不涉及 JNDI 查找,目的地根據其名稱解析。

34.1.3、使用 JNDI ConnectionFactory

如果你在應用服務器中運行應用程序,Spring Boot 會嘗試使用 JNDI 來定位 JMS ConnectionFactory。默認情況下,會選中 java:/JmsXA 和 java:/XAConnectionFactory 位置。如果需要指定替代位置,可以使用 spring.jms.jndi-name 屬性,如下面示例所示:

<code>spring.jms.jndi-name=java:/MyConnectionFactory/<code>

34.1.4、發送消息

Spring 的 JmsTemplate 是自動配置的,你可以直接將其自動裝配到自己的 bean 中,如下面示例所示:

Spring Boot中文參考指南(2.1.6)34、消息傳遞

<code>import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Component;

@Component
public class MyBean {

private final JmsTemplate jmsTemplate;

@Autowired
public MyBean(JmsTemplate jmsTemplate) {
this.jmsTemplate = jmsTemplate;
}

// ...

}/<code>

註釋:可以以類似的方式注入 JmsMessagingTemplate。如果定義了 DestinationResolver 或 MessageConverter bean,它將自動關聯到自動配置的 JmsTemplate。

34.1.5、接收消息

當 JMS 基礎設施存在時,任何 bean 都可以用 @JmsListener 註解以創建監聽器端點。如果未定義 JmsListenerContainerFactory,則會自動配置默認值。如果定義了 DestinationResolver 或 MessageConverter bean,則它將自動關聯到默認工廠。

默認情況下,默認工廠是事務性的。如果在存在 JtaTransactionManager 的基礎設施中運行,則默認情況下它與監聽器容器相關聯。如果沒有,則啟用 sessionTransacted 標誌。在後一種情況下,你可以通過在監聽器方法(或其委託)上添加 @Transactional 來將本地數據存儲事務與傳入消息的處理相關聯。這將確保在本地事務完成後確認傳入消息。這還包括髮送在同一 JMS 會話上執行的響應消息。

以下組件在 someQueue 目的地上創建監聽器端點:

Spring Boot中文參考指南(2.1.6)34、消息傳遞

<code>@Component
public class MyBean {

@JmsListener(destination = "someQueue")
public void processMessage(String content) {
// ...
}

}/<code>

提示:有關更多詳細信息,請參閱 @EnableJms 的 Javadoc。(https://docs.spring.io/spring/docs/5.1.8.RELEASE/javadoc-api/org/springframework/jms/annotation/EnableJms.html )

如果需要創建更多的 JmsListenerContainerFactory 實例,或者如果要覆蓋默認值,Spring Boot 將提供一個 DefaultJmsListenerContainerFactoryConfigurer,你可以使用它及與自動配置的設置相同的設置來初始化 DefaultJmsListenerContainerFactory 。

例如,下面的示例公開了另一個使用特定 MessageConverter 的工廠。

Spring Boot中文參考指南(2.1.6)34、消息傳遞

<code>@Configuration
static class JmsConfiguration {

@Bean
public DefaultJmsListenerContainerFactory myFactory(
DefaultJmsListenerContainerFactoryConfigurer configurer) {
DefaultJmsListenerContainerFactory factory =
new DefaultJmsListenerContainerFactory();
configurer.configure(factory, connectionFactory());
factory.setMessageConverter(myMessageConverter());
return factory;
}

}/<code>

然後,你可以在任何基於 @JmsListener 註解的方法中使用該工廠,如下所示:

Spring Boot中文參考指南(2.1.6)34、消息傳遞

<code>@Component
public class MyBean {

@JmsListener(destination = "someQueue", containerFactory="myFactory")
public void processMessage(String content) {
// ...
}

}/<code>

下一篇[未完待續]


分享到:


相關文章: