最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

spring 使用RabbitMQ進(jìn)行消息傳遞的示例代碼

 更新時(shí)間:2018年12月10日 17:07:32   作者:UncleCatMySelf  
這篇文章主要介紹了spring 使用RabbitMQ進(jìn)行消息傳遞的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

前言

本系列Demo均以SpringBoot快速構(gòu)建,基本包使用到lombok(一個(gè)便捷的對(duì)象構(gòu)造工具 get/set)、spring-boot-starter-web,使用SpringBoot僅為了快速構(gòu)建Sample項(xiàng)目,對(duì)于學(xué)習(xí)Spring的對(duì)應(yīng)功能無(wú)影響。

我們希望你已經(jīng)有一定的java基礎(chǔ)與了解一個(gè)自己喜歡的IDEA功能,謝謝。

GitHub

地址:https://github.com/UncleCatMySelf/Spring-Tutorial

學(xué)習(xí)

完成設(shè)置發(fā)布和訂閱消息的RabbitMQ AMQP服務(wù)器的過(guò)程。

構(gòu)建

構(gòu)建一個(gè)使用Spring AMQP發(fā)布消息的應(yīng)用程序,RabbitTemplate并使用POJO訂閱消息MessageListenerAdapter。

創(chuàng)建Rabbit MQ消息接收器

使用任何基于消息傳遞的應(yīng)用程序,您需要?jiǎng)?chuàng)建一個(gè)響應(yīng)已發(fā)布消息的接收器。

@Slf4j
@Component
public class Receiver {

 private CountDownLatch latch = new CountDownLatch(1);

 public void receiveMessage(String message){
  log.info("Received < " + message + " >");
  latch.countDown();
 }

 public CountDownLatch getLatch(){
  return latch;
 }

}

Receiver是一個(gè)簡(jiǎn)單的POJO,它定義了一種接收消息的方法。當(dāng)您注冊(cè)它以接收消息時(shí),您可以將其命名為任何您想要的名稱。

為方便起見(jiàn),這個(gè)POJO也有一個(gè)CountDownLatch。這允許它發(fā)信號(hào)通知接收到消息。這是您不太可能在生產(chǎn)應(yīng)用程序中實(shí)現(xiàn)的。

注冊(cè)監(jiān)聽(tīng)器并發(fā)送消息

Spring AMQP RabbitTemplate 提供了使用RabbitMQ發(fā)送和接收消息所需的一切。具體來(lái)說(shuō),你需要配置:

  • 消息偵聽(tīng)器容器
  • 聲明隊(duì)列,交換以及它們之間的綁定
  • 用于發(fā)送一些消息以測(cè)試偵聽(tīng)器的組件

Spring Boot會(huì)自動(dòng)創(chuàng)建連接工廠和RabbitTemplate,從而減少您必須編寫(xiě)的代碼量。

您將使用RabbitTemplate發(fā)送消息,并將Receiver使用消息偵聽(tīng)器容器注冊(cè),以接收消息。連接工廠驅(qū)動(dòng)兩者,允許它們連接到RabbitMQ服務(wù)器。

@SpringBootApplication
public class RabbitmqApplication {

 static final String topicExchangeName = "spring-boot-exchange";

 static final String queueName = "spring-boot";

 @Bean
 Queue queue(){
 return new Queue(queueName, false);
 }

 @Bean
 TopicExchange exchange(){
 return new TopicExchange(topicExchangeName);
 }

 @Bean
 Binding binding(Queue queue,TopicExchange exchange){
 return BindingBuilder.bind(queue).to(exchange).with("foo.bar.#");
 }

 @Bean
 SimpleMessageListenerContainer container(ConnectionFactory connectionFactory,
   MessageListenerAdapter listenerAdapter){
 SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
 container.setConnectionFactory(connectionFactory);
 container.setQueueNames(queueName);
 container.setMessageListener(listenerAdapter);
 return container;
 }

 @Bean
 MessageListenerAdapter listenerAdapter(Receiver receiver){
 return new MessageListenerAdapter(receiver, "receiveMessage");
 }

 public static void main(String[] args) {
 SpringApplication.run(RabbitmqApplication.class, args).close();
 }
}

@SpringBootApplication 是一個(gè)便利注釋,添加了以下所有內(nèi)容:

  • @Configuration 標(biāo)記該類作為應(yīng)用程序上下文的bean定義的源。
  • @EnableAutoConfiguration 告訴Spring Boot開(kāi)始根據(jù)類路徑設(shè)置,其他bean和各種屬性設(shè)置添加bean。
  • 通常你會(huì)添加@EnableWebMvc一個(gè)Spring MVC應(yīng)用程序,但Spring Boot會(huì)在類路徑上看到spring-webmvc時(shí)自動(dòng)添加它。這會(huì)將應(yīng)用程序標(biāo)記為Web應(yīng)用程序并激活關(guān)鍵行為,例如設(shè)置a DispatcherServlet。
  • @ComponentScan告訴Spring在包中尋找其他組件,配置和服務(wù)hello,允許它找到控制器。

該main()方法使用Spring Boot的SpringApplication.run()方法來(lái)啟動(dòng)應(yīng)用程序。您是否注意到?jīng)]有一行XML?也沒(méi)有web.xml文件。此Web應(yīng)用程序是100%純Java,您無(wú)需處理配置任何管道或基礎(chǔ)結(jié)構(gòu)。

listenerAdapter()方法中定義的bean在定義的容器中注冊(cè)為消息偵聽(tīng)器container()。它將偵聽(tīng)“spring-boot”隊(duì)列中的消息。因?yàn)镽eceiver該類是POJO,所以需要將其包裝在MessageListenerAdapter指定要調(diào)用的位置receiveMessage。

JMS隊(duì)列和AMQP隊(duì)列具有不同的語(yǔ)義。例如,JMS僅向一個(gè)使用者發(fā)送排隊(duì)的消息。雖然AMQP隊(duì)列執(zhí)行相同的操作,但AMQP生成器不會(huì)直接向隊(duì)列發(fā)送消息。相反,消息被發(fā)送到交換機(jī),交換機(jī)可以轉(zhuǎn)到單個(gè)隊(duì)列,或扇出到多個(gè)隊(duì)列,模仿JMS主題的概念。

消息監(jiān)聽(tīng)器容器和接收器bean是您監(jiān)聽(tīng)消息所需的全部?jī)?nèi)容。要發(fā)送消息,您還需要一個(gè)Rabbit模板。

該queue()方法創(chuàng)建AMQP隊(duì)列。該exchange()方法創(chuàng)建主題交換。該binding()方法將這兩者綁定在一起,定義RabbitTemplate發(fā)布到交換時(shí)發(fā)生的行為。

Spring AMQP要求將the Queue,the TopicExchange,和Binding聲明為頂級(jí)Spring bean才能正確設(shè)置。

在這種情況下,我們使用主題交換,并且隊(duì)列與路由密鑰綁定,foo.bar.#這意味著使用以路由鍵開(kāi)頭的任何消息foo.bar.將被路由到隊(duì)列。

發(fā)送測(cè)試消息

測(cè)試消息由CommandLineRunner,他還等待接收器中的鎖存器并關(guān)閉應(yīng)用程序上下文:

@Slf4j
@Component
public class Runner implements CommandLineRunner {

 private final RabbitTemplate rabbitTemplate;
 private final Receiver receiver;

 public Runner(Receiver receiver, RabbitTemplate rabbitTemplate){
  this.receiver = receiver;
  this.rabbitTemplate = rabbitTemplate;
 }

 @Override
 public void run(String... strings) throws Exception {
  log.info("Sending message....");
  rabbitTemplate.convertAndSend(RabbitmqApplication.topicExchangeName,"foo.bar.baz","Hello from RabbitMQ!");
  receiver.getLatch().await(10000, TimeUnit.MILLISECONDS);
 }
}

請(qǐng)注意,模板將消息路由到交換機(jī),其路由密鑰foo.bar.baz與綁定匹配。

可以在測(cè)試中模擬出運(yùn)行器,以便可以單獨(dú)測(cè)試接收器。

運(yùn)行程序,你應(yīng)該看到如下輸出:

2018-12-03 10:23:46.779 INFO 10828 --- [   main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2018-12-03 10:23:46.782 INFO 10828 --- [   main] c.g.unclecatmyself.RabbitmqApplication : Started RabbitmqApplication in 3.61 seconds (JVM running for 4.288)
2018-12-03 10:23:46.784 INFO 10828 --- [   main] com.github.unclecatmyself.Runner   : Sending message....
2018-12-03 10:23:46.793 INFO 10828 --- [ container-1] com.github.unclecatmyself.Receiver  : Received < Hello from RabbitMQ! >
2018-12-03 10:23:46.799 INFO 10828 --- [   main] o.s.a.r.l.SimpleMessageListenerContainer : Waiting for workers to finish.
2018-12-03 10:23:47.813 INFO 10828 --- [   main] o.s.a.r.l.SimpleMessageListenerContainer : Successfully waited for workers to finish.
2018-12-03 10:23:47.815 INFO 10828 --- [   main] o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor'
2018-12-03 10:23:47.816 INFO 10828 --- [   main] o.s.a.r.l.SimpleMessageListenerContainer : Shutdown ignored - container is not active already

結(jié)尾

恭喜!您剛剛使用Spring和RabbitMQ開(kāi)發(fā)了一個(gè)簡(jiǎn)單的發(fā)布 - 訂閱應(yīng)用程序。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java 使用多線程調(diào)用類的靜態(tài)方法的示例

    Java 使用多線程調(diào)用類的靜態(tài)方法的示例

    這篇文章主要介紹了Java 使用多線程調(diào)用類的靜態(tài)方法的示例,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-10-10
  • 2019年最新Java學(xué)習(xí)路線圖

    2019年最新Java學(xué)習(xí)路線圖

    不管你是不懂電腦的小白,還是已經(jīng)步入開(kāi)發(fā)的大牛,這套路線路絕對(duì)不容錯(cuò)過(guò),路線圖的宗旨就是分享,專業(yè),便利,讓喜愛(ài)Java的人,都能平等的學(xué)習(xí),感興趣的同學(xué)可以了解一下
    2019-03-03
  • 消息隊(duì)列MQ使用詳解

    消息隊(duì)列MQ使用詳解

    消息隊(duì)列(MQ)是一種基于“先進(jìn)先出”原則的數(shù)據(jù)結(jié)構(gòu),廣泛應(yīng)用于分布式系統(tǒng)中,主要用于應(yīng)用解耦、異步消息處理和流量削峰,消息隊(duì)列中間件通過(guò)允許生產(chǎn)者發(fā)送消息到隊(duì)列,消費(fèi)者從隊(duì)列中拉取消息或訂閱消息,實(shí)現(xiàn)高效、可擴(kuò)展和最終一致性的系統(tǒng)架構(gòu)
    2024-10-10
  • Java中HashMap和Hashtable及HashSet的區(qū)別

    Java中HashMap和Hashtable及HashSet的區(qū)別

    以下是對(duì)Java中HashMap和Hashtable及HashSet的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下
    2013-09-09
  • spring boot aop 記錄方法執(zhí)行時(shí)間代碼示例

    spring boot aop 記錄方法執(zhí)行時(shí)間代碼示例

    這篇文章主要介紹了spring boot aop 記錄方法執(zhí)行時(shí)間代碼示例,分享了相關(guān)代碼,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • java實(shí)現(xiàn)JSON字符串格式化輸出

    java實(shí)現(xiàn)JSON字符串格式化輸出

    這篇文章主要為大家詳細(xì)介紹了如何使用java實(shí)現(xiàn)JSON字符串格式化輸出,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以了解下
    2024-01-01
  • java原碼補(bǔ)碼反碼關(guān)系解析

    java原碼補(bǔ)碼反碼關(guān)系解析

    這篇文章主要為大家詳細(xì)介紹了java原碼補(bǔ)碼反碼的關(guān)系,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • Spring+SpringMVC+Hibernate項(xiàng)目環(huán)境搭建的步驟(圖文)

    Spring+SpringMVC+Hibernate項(xiàng)目環(huán)境搭建的步驟(圖文)

    這篇文章主要介紹了Spring+SpringMVC+Hibernate項(xiàng)目環(huán)境搭建的步驟(圖文),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • JAVA隨機(jī)數(shù)隨機(jī)字母的實(shí)現(xiàn)(微信搶紅包小練習(xí))

    JAVA隨機(jī)數(shù)隨機(jī)字母的實(shí)現(xiàn)(微信搶紅包小練習(xí))

    這篇文章主要介紹了JAVA隨機(jī)數(shù)隨機(jī)字母的實(shí)現(xiàn)(微信搶紅包小練習(xí)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • Java?Api實(shí)現(xiàn)Elasticsearch的滾動(dòng)查詢功能

    Java?Api實(shí)現(xiàn)Elasticsearch的滾動(dòng)查詢功能

    這篇文章主要介紹了Java?Api實(shí)現(xiàn)Elasticsearch的滾動(dòng)查詢,解決ES每次只能查詢一萬(wàn)條數(shù)據(jù)的問(wèn)題,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-08-08

最新評(píng)論

巴楚县| 东平县| 溧水县| 砚山县| 天门市| 博爱县| 铜陵市| 晋江市| 红桥区| 张家川| 丹寨县| 丽江市| 湖南省| 牙克石市| 博客| 山阳县| 靖江市| 伊金霍洛旗| 绥滨县| 普定县| 布拖县| 温州市| 精河县| 桐城市| 通化县| 仁寿县| 阿克苏市| 遵义县| 酒泉市| 栖霞市| 石楼县| 扬中市| 措美县| 偏关县| 汉沽区| 沿河| 淅川县| 靖远县| 同心县| 贞丰县| 道孚县|