欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

spring 使用RabbitMQ進行消息傳遞的示例代碼

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

前言

本系列Demo均以SpringBoot快速構建,基本包使用到lombok(一個便捷的對象構造工具 get/set)、spring-boot-starter-web,使用SpringBoot僅為了快速構建Sample項目,對于學習Spring的對應功能無影響。

我們希望你已經有一定的java基礎與了解一個自己喜歡的IDEA功能,謝謝。

GitHub

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

學習

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

構建

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

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

使用任何基于消息傳遞的應用程序,您需要創(chuà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是一個簡單的POJO,它定義了一種接收消息的方法。當您注冊它以接收消息時,您可以將其命名為任何您想要的名稱。

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

注冊監(jiān)聽器并發(fā)送消息

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

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

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

您將使用RabbitTemplate發(fā)送消息,并將Receiver使用消息偵聽器容器注冊,以接收消息。連接工廠驅動兩者,允許它們連接到RabbitMQ服務器。

@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 是一個便利注釋,添加了以下所有內容:

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

該main()方法使用Spring Boot的SpringApplication.run()方法來啟動應用程序。您是否注意到沒有一行XML?也沒有web.xml文件。此Web應用程序是100%純Java,您無需處理配置任何管道或基礎結構。

listenerAdapter()方法中定義的bean在定義的容器中注冊為消息偵聽器container()。它將偵聽“spring-boot”隊列中的消息。因為Receiver該類是POJO,所以需要將其包裝在MessageListenerAdapter指定要調用的位置receiveMessage。

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

消息監(jiān)聽器容器和接收器bean是您監(jiān)聽消息所需的全部內容。要發(fā)送消息,您還需要一個Rabbit模板。

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

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

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

發(fā)送測試消息

測試消息由CommandLineRunner,他還等待接收器中的鎖存器并關閉應用程序上下文:

@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);
 }
}

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

可以在測試中模擬出運行器,以便可以單獨測試接收器。

運行程序,你應該看到如下輸出:

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

結尾

恭喜!您剛剛使用Spring和RabbitMQ開發(fā)了一個簡單的發(fā)布 - 訂閱應用程序。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 源碼分析Spring?中?@Qualifier?注解基本用法

    源碼分析Spring?中?@Qualifier?注解基本用法

    這篇文章主要介紹了源碼分析Spring?中?@Qualifier?注解基本用法,在源碼分析的過程中,也?GET?到?Spring?許多新的玩法,感興趣的小伙伴趕緊去試試吧
    2023-08-08
  • 淺談Java中的this作為返回值時返回的是什么

    淺談Java中的this作為返回值時返回的是什么

    Java中的this作為返回值時返回的是什么?下面小編就為大家介紹一下Java中的this作為返回值時返回。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • Spring?Data?JPA實現(xiàn)持久化存儲數(shù)據(jù)到數(shù)據(jù)庫的示例代碼

    Spring?Data?JPA實現(xiàn)持久化存儲數(shù)據(jù)到數(shù)據(jù)庫的示例代碼

    Spring Data JPA是Spring基于JPA規(guī)范的基礎上封裝的?套 JPA 應?框架,可使開發(fā)者?極簡的代碼即可實現(xiàn)對數(shù)據(jù)庫的訪問和操作。本文我們來了解如何用Spring?Data?JPA框架實現(xiàn)數(shù)據(jù)持久化存儲到數(shù)據(jù)庫,感興趣的可以了解一下
    2022-04-04
  • @RunWith(SpringJUnit4ClassRunner.class)報錯問題及解決

    @RunWith(SpringJUnit4ClassRunner.class)報錯問題及解決

    這篇文章主要介紹了@RunWith(SpringJUnit4ClassRunner.class)報錯問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • slf4j使用log4j的配置參數(shù)方式

    slf4j使用log4j的配置參數(shù)方式

    這篇文章主要介紹了slf4j使用log4j的配置參數(shù)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 詳解Java回調的原理與實現(xiàn)

    詳解Java回調的原理與實現(xiàn)

    回調函數(shù),顧名思義,用于回調的函數(shù)?;卣{函數(shù)只是一個功能片段,由用戶按照回調函數(shù)調用約定來實現(xiàn)的一個函數(shù)?;卣{函數(shù)是一個工作流的一部分,由工作流來決定函數(shù)的調用(回調)時機。
    2017-03-03
  • Java設計模式編程中簡單工廠與抽象工廠模式的使用實例

    Java設計模式編程中簡單工廠與抽象工廠模式的使用實例

    這篇文章主要介紹了Java設計模式編程中簡單工廠與抽象工廠模式的使用實例,簡單工廠與抽象工廠都可以歸類于設計模式中的創(chuàng)建型模式,需要的朋友可以參考下
    2016-04-04
  • MyBatis實現(xiàn)多表聯(lián)合查詢resultType的返回值

    MyBatis實現(xiàn)多表聯(lián)合查詢resultType的返回值

    這篇文章主要介紹了MyBatis多表聯(lián)合查詢resultType的返回值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java實現(xiàn)解壓zip和rar包的示例代碼

    Java實現(xiàn)解壓zip和rar包的示例代碼

    這篇文章主要為大家詳細介紹了如何使用Java實現(xiàn)解壓zip和rar包,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-01-01
  • Java探索之Feign入門使用詳解

    Java探索之Feign入門使用詳解

    這篇文章主要介紹了Java探索之Feign入門使用詳解,關于feign,我也是第一次遇到,于是在網上搜集了相關文章,這篇比較詳細,介紹了其簡介,選擇feign的原因以及其他相關內容,需要的朋友可以參考下。
    2017-10-10

最新評論