摘要:還自動配置發送和接收消息所需的基礎設施。支持是一個輕量級的可靠的可伸縮的可移植的消息代理,基于協議,使用通過協議進行通信。
32. 消息傳遞
Spring框架為與消息傳遞系統集成提供了廣泛的支持,從使用JmsTemplate簡化的JMS API到使用完整的基礎設施異步接收消息,Spring AMQP為高級消息隊列協議提供了類似的特性集。Spring Boot還為RabbitTemplate和RabbitMQ提供自動配置選項,Spring WebSocket原生包括對STOMP消息的支持,Spring Boot通過啟動器和少量的自動配置支持這一點,Spring Boot還支持Apache Kafka。
32.1 JMSjavax.jms.ConnectionFactory接口提供了創建javax.jms.Connection與JMS代理交互的標準方法,盡管Spring需要一個ConnectionFactory來處理JMS,你通常不需要自己直接使用它,而是可以依賴于更高級別的消息傳遞抽象。(詳見Spring Framework參考文檔的相關部分。)Spring Boot還自動配置發送和接收消息所需的基礎設施。
32.1.1 ActiveMQ支持當ActiveMQ在類路徑上可用時,Spring Boot還可以配置ConnectionFactory,如果代理存在,則會自動啟動和配置嵌入式代理(只要沒有通過配置指定代理URL)。
如果你使用spring-boot-starter-activemq,那么將提供連接或嵌入ActiveMQ實例所需的依賴項,與JMS集成的Spring基礎設施也是一樣。
ActiveMQ配置由在spring.activemq.*中的外部配置屬性控制,例如,你可以在application.properties中聲明以下部分:
spring.activemq.broker-url=tcp://192.168.1.210:9876 spring.activemq.user=admin spring.activemq.password=secret
你還可以通過向org.apache.activemq:activemq-pool添加一個依賴項來共享JMS資源并相應地配置PooledConnectionFactory,如下例所示:
spring.activemq.pool.enabled=true spring.activemq.pool.max-connections=50
有關更多支持的選項,請參見ActiveMQProperties,你還可以注冊一個任意數量的實現activemqconnectionfactorycustomzer的bean進行更高級的自定義。
默認情況下,ActiveMQ創建一個目的地,如果它還不存在,那么目的地將根據它們提供的名稱解析。
32.1.2 Artemis支持Spring Boot可以自動配置ConnectionFactory,當它檢測到在類路徑上可用的Artemis時,如果代理存在,則自動啟動和配置嵌入式代理(除非模式屬性已顯式設置),所支持的模式是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.artemis.mode=native spring.artemis.host=192.168.1.210 spring.artemis.port=9876 spring.artemis.user=admin spring.artemis.password=secret
在嵌入代理時,你可以選擇是否啟用持久性,并列出應該可用的目的地,可以將它們指定為逗號分隔的列表,以使用默認選項創建它們,或者可以定義類型為org.apache.activemq.artemis.jms.server.config.JMSQueueConfiguration或org.apache.activemq.artemis.jms.server.config.TopicConfiguration的bean,分別用于高級隊列和主題配置。
有關更多受支持的選項,請參閱ArtemisProperties。
不涉及JNDI查找,目的地根據它們的名稱進行解析,使用Artemis配置中的name屬性或通過配置提供的名稱。
32.1.3 使用JNDI ConnectionFactory如果你正在應用服務器中運行應用程序,Spring Boot試圖使用JNDI定位JMS ConnectionFactory,默認情況下,檢查java:/JmsXA和java:/XAConnectionFactory位置,如果需要指定替代位置,可以使用spring.jms.jndi-name屬性,如下例所示:
spring.jms.jndi-name=java:/MyConnectionFactory32.1.4 發送消息
Spring的JmsTemplate是自動配置的,你可以將其自動連接到你自己的bean中,如下面的示例所示:
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; } // ... }
JmsMessagingTemplate可以以類似的方式注入,如果定義了DestinationResolver或MessageConverter bean,則它將自動關聯到自動配置的JmsTemplate。32.1.5 接收消息
當出現JMS基礎設施時,可以使用@JmsListener注解任何bean,以創建監聽器端點,如果沒有定義JmsListenerContainerFactory,則會自動配置默認工廠,如果定義了DestinationResolver或MessageConverter bean,則它將自動關聯到默認工廠。
默認情況下,默認工廠是事務性的,如果你運行的基礎設施中存在JtaTransactionManager,那么它默認與偵聽器容器相關聯,如果沒有,則啟用sessionTransacted標志。在后一個場景中,你可以通過在監聽器方法(或委托)上添加@Transactional,將本地數據存儲事務與接收消息的處理相關聯,這確保在本地事務完成之后,傳入消息得到確認,這還包括發送在相同JMS會話上執行的響應消息。
以下組件在someQueue目的地上創建監聽器端點:
@Component public class MyBean { @JmsListener(destination = "someQueue") public void processMessage(String content) { // ... } }
有關更多細節,請參見@EnableJms的Javadoc。
如果你需要創建更多的JmsListenerContainerFactory實例,或者希望重寫默認的實例,Spring Boot提供了一個DefaultJmsListenerContainerFactoryConfigurer,你可以使用它來初始化一個DefaultJmsListenerContainerFactory,其設置與自動配置的工廠相同。
例如,下面的示例公開了另一個使用特定MessageConverter的工廠:
@Configuration static class JmsConfiguration { @Bean public DefaultJmsListenerContainerFactory myFactory( DefaultJmsListenerContainerFactoryConfigurer configurer) { DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory(); configurer.configure(factory, connectionFactory()); factory.setMessageConverter(myMessageConverter()); return factory; } }
然后你可以在任何@JmsListener注解的方法中使用工廠,如下所示:
32.2 AMQP高級消息隊列協議(AMQP)是面向消息的中間件的一種平臺無關的、有線級別的協議。Spring AMQP項目將核心Spring概念應用于基于AMQP的消息傳遞解決方案的開發,Spring Boot為通過RabbitMQ使用AMQP提供了一些方便,包括spring-boot-starter-amqp“啟動器”。
32.2.1 RabbitMQ支持RabbitMQ是一個輕量級的、可靠的、可伸縮的、可移植的消息代理,基于AMQP協議,Spring使用RabbitMQ通過AMQP協議進行通信。
RabbitMQ配置由spring.rabbitmq.*的外部配置屬性控制,例如,你可以在application.properties中聲明以下部分:
spring.rabbitmq.host=localhost spring.rabbitmq.port=5672 spring.rabbitmq.username=admin spring.rabbitmq.password=secret
如果上下文中存在ConnectionNameStrategy bean,那么它將自動用于命名由自動配置的ConnectionFactory創建的連接。有關更多受支持的選項,請參閱RabbitProperties。
有關詳細信息,請參閱RabbitMQ使用的協議AMQP32.2.2 發送消息
Spring的AmqpTemplate和AmqpAdmin是自動配置的,你可以將它們自動連接到你自己的bean中,如下面的示例所示:
import org.springframework.amqp.core.AmqpAdmin;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.amqp.core.AmqpAdmin; import org.springframework.amqp.core.AmqpTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class MyBean { private final AmqpAdmin amqpAdmin; private final AmqpTemplate amqpTemplate; @Autowired public MyBean(AmqpAdmin amqpAdmin, AmqpTemplate amqpTemplate) { this.amqpAdmin = amqpAdmin; this.amqpTemplate = amqpTemplate; } // ... }
RabbitMessagingTemplate可以以類似的方式注入,如果定義了MessageConverter bean,它會自動關聯到自動配置的AmqpTemplate。
如果有必要,任何定義為bean的org.springframework.amqp.core.Queue自動用于在RabbitMQ實例上聲明相應的隊列。
重試操作,可以對AmqpTemplate啟用重試(例如,如果代理連接丟失了),默認情況下禁用重試。
32.2.3 接收消息當Rabbit基礎設施存在時,可以使用@RabbitListener對任何bean進行注解,以創建監聽器端點,如果沒有定義RabbitListenerContainerFactory,則會自動配置默認的SimpleRabbitListenerContainerFactory,你可以使用spring.rabbitmq.listener.type屬性切換到直接容器。如果定義了MessageConverter或MessageRecoverer bean,則它將自動與默認工廠相關聯。
以下示例組件在someQueue隊列上創建監聽器端點:
@Component public class MyBean { @RabbitListener(queues = "someQueue") public void processMessage(String content) { // ... } }
有關更多細節,請參見@EnableRabbit的Javadoc。
如果你需要創建更多的RabbitListenerContainerFactory實例,或者你想要覆蓋缺省值,Spring Boot提供了一個SimpleRabbitListenerContainerFactoryConfigurer和一個DirectRabbitListenerContainerFactoryConfigurer,你可以使用它們初始化一個SimpleRabbitListenerContainerFactory,以及一個DirectRabbitListenerContainerFactory,其設置與自動配置使用的工廠相同。
選擇哪種容器類型并不重要,這兩個bean通過自動配置公開。
例如,下面的configuration類公開另一個使用特定MessageConverter的工廠:
@Configuration static class RabbitConfiguration { @Bean public SimpleRabbitListenerContainerFactory myFactory( SimpleRabbitListenerContainerFactoryConfigurer configurer) { SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory(); configurer.configure(factory, connectionFactory); factory.setMessageConverter(myMessageConverter()); return factory; } }
然后你可以在任何@RabbitListener注解的方法中使用工廠,如下所示:
@Component public class MyBean { @RabbitListener(queues = "someQueue", containerFactory="myFactory") public void processMessage(String content) { // ... } }
你可以啟用重試來處理監聽器拋出異常的情況,默認情況下,使用RejectAndDontRequeueRecoverer,但是可以定義自己的MessageRecoverer,當重試結束時,消息將被拒絕,如果將代理配置為這樣做,則消息將被刪除或路由到死信交換,默認情況下,重試被禁用。
重要32.3 Apache Kafka支持
默認情況下,如果重試被禁用并且監聽器拋出異常,該遞送被無限期地重試,你可以用兩種方式修改此行為:將defaultRequeueRejected屬性設置為false,以便嘗試零重復發送,或者拋出AmqpRejectAndDontRequeueException來通知消息應該被拒絕,后者是在啟用重試并達到最大提交嘗試次數時使用的機制。
通過提供spring-kafka項目的自動配置來支持Apache Kafka。
Kafka配置由spring.kafka.*中的外部配置屬性控制,例如,你可以在application.properties中聲明以下部分:
spring.kafka.bootstrap-servers=localhost:9092 spring.kafka.consumer.group-id=myGroup
要在啟動時創建主題,請添加一個類型NewTopic的bean,如果主題已經存在,則忽略bean。
有關更多受支持的選項,請參閱KafkaProperties。
32.3.1 發送消息Spring的KafkaTemplate是自動配置的,你可以直接在你自己的bean中自動連接它,如下面的示例所示:
@Component public class MyBean { private final KafkaTemplate kafkaTemplate; @Autowired public MyBean(KafkaTemplate kafkaTemplate) { this.kafkaTemplate = kafkaTemplate; } // ... }
如果定義了一個RecordMessageConverter bean,它將自動關聯到自動配置的KafkaTemplate32.3.2 接收消息
當存在Apache Kafka基礎設施時,任何bean都可以使用@KafkaListener進行注解,以創建監聽器端點,如果沒有定義KafkaListenerContainerFactory,默認設置為使用spring.kafka.listener.*中定義的鍵,此外,如果定義了一個RecordMessageConverter bean,它將自動關聯到默認的工廠。
@Component public class MyBean { @KafkaListener(topics = "someTopic") public void processMessage(String content) { // ... } }32.3.3 附加的Kafka屬性
自動配置所支持的屬性顯示在附錄A中,通用的應用程序屬性。注意,在大多數情況下,這些屬性(連字符或駝峰式大小寫)直接映射到Apache Kafka *屬性,有關詳細信息,請參閱Apache Kafka文檔。
前幾個屬性同時適用于生產者和消費者,但是如果你希望對每個屬性使用不同的值,可以在生產者或消費者級別指定,Apache Kafka設計具有高、中或低重要性的屬性,Spring Boot自動配置支持所有重要屬性、一些選定的中屬性和低屬性,以及任何沒有默認值的屬性。
Kafka支持的屬性中只有一部分是可以通過KafkaProperties類獲得的,如果你希望為生產者或消費者配置不受直接支持的其他屬性,請使用以下屬性:
spring.kafka.properties.prop.one=first spring.kafka.admin.properties.prop.two=second spring.kafka.consumer.properties.prop.three=third spring.kafka.producer.properties.prop.four=fourth
這將設置通用的prop.oneKafka屬性為first(適用于生產者、消費者和管理員),prop.two 管理員屬性為second,prop.three消費者屬性為third并且prop.four生產者屬性為fourth。
你還可以配置Spring Kafka JsonDeserializer,如下所示:
spring.kafka.consumer.value-deserializer=org.springframework.kafka.support.serializer.JsonDeserializer spring.kafka.consumer.properties.spring.json.value.default.type=com.example.Invoice spring.kafka.consumer.properties.spring.json.trusted.packages=com.example,org.acme
同樣,可以禁用JsonSerializer在header中發送類型信息的默認行為:
spring.kafka.producer.value-serializer=org.springframework.kafka.support.serializer.JsonSerializer spring.kafka.producer.properties.spring.json.add.type.headers=false
以這種方式設置的屬性將覆蓋Spring Boot顯式支持的任何配置項。下一篇:使用RestTemplate調用REST服務
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/71226.html
摘要:參考指南使你可以輕松地創建可運行的獨立的生產級的基于的應用程序,我們對平臺和第三方庫有自己的看法,這樣你就可以以最低限度工作開始了,大多數應用程序都需要很少的配置。文檔本節簡要概述了參考文檔,它充當文檔其余部分的映射。 Spring Boot 參考指南 Spring Boot使你可以輕松地創建可運行的獨立的、生產級的基于Spring的應用程序,我們對Spring平臺和第三方庫有自己的看...
摘要:還配置了一些特性,這些特性是由額外的模塊的存在觸發的。通過監控和管理管理擴展提供了一種監控和管理應用程序的標準機制,默認情況下,創建了有一個的的,并公開了使用注解或注解的任何。有關更多細節,請參見類。 40. Spring Integration Spring Boot為使用Spring Integration提供了一些方便,引入spring-boot-starter-integrat...
摘要:指南無論你正在構建什么,這些指南都旨在讓你盡快提高工作效率使用團隊推薦的最新項目版本和技術。使用進行消息傳遞了解如何將用作消息代理。安全架構的主題指南,這些位如何組合以及它們如何與交互。使用的主題指南以及如何為應用程序創建容器鏡像。 Spring 指南 無論你正在構建什么,這些指南都旨在讓你盡快提高工作效率 — 使用Spring團隊推薦的最新Spring項目版本和技術。 入門指南 這些...
摘要:關于文檔參考指南可用如下方式最新的副本可以在中找到。嘗試操作文檔,它們為最常見的問題提供解決方案。學習基礎,構建在許多其他項目上,網站提供豐富的參考文檔,如果你要從開始,嘗試其中一個指南。我們對進行監視,以解決帶有標記的問題。 1. 關于文檔 Spring Boot 參考指南可用如下方式: HTML PDF EPUB 最新的副本可以在 docs.spring.io/spring-b...
摘要:在創建之前,實際上觸發了一些事件,因此不能將偵聽器注冊為。使用的事件發布機制發送應用程序事件,該機制的一部分確保在子環境中發布給偵聽器的事件也會在任何祖先上下文中被發布給監聽器。 23. SpringApplication SpringApplication類提供了一種方便的方法來引導從main()方法開始的Spring應用程序。在許多情況下,你可以委托給靜態SpringApplica...
閱讀 3022·2021-11-18 10:07
閱讀 3765·2021-11-17 17:00
閱讀 2103·2021-11-15 18:01
閱讀 926·2021-10-11 10:58
閱讀 3373·2021-09-10 10:50
閱讀 3442·2021-08-13 15:05
閱讀 1229·2019-08-30 15:53
閱讀 2640·2019-08-29 13:01