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