1. 程式人生 > >SpringBoot的RabbitMQ訊息佇列: 一、訊息傳送接收第一印象

SpringBoot的RabbitMQ訊息佇列: 一、訊息傳送接收第一印象

編制RabbitMQ配置、傳送、接受的程式碼

1、編寫配置檔案類

在com.example包中增加類,名稱為HelloRabbitConfig,並修改程式碼為

  1. package com.example;  
  2. import org.springframework.amqp.core.Queue;  
  3. import org.springframework.context.annotation.Bean;  
  4. import org.springframework.context.annotation.Configuration;  
  5. @Configuration
  6. publicclass HelloRabbitConfig {  
  7.     @Bean
  8.     public Queue helloQueue() {  
  9.         returnnew Queue("hello");  
  10.     }  
  11. }  

2、編寫傳送訊息類

在com.example包中增加類,名稱為HelloSender,並修改程式碼為

  1. package com.example;  
  2. import java.util.Date;  
  3. import org.slf4j.Logger;  
  4. import org.slf4j.LoggerFactory;  
  5. import org.springframework.amqp.core.AmqpTemplate;  
  6. import org.springframework.beans.factory.annotation.Autowired;  
  7. import org.springframework.stereotype.Component;  
  8. @Component
  9. publicclass HelloSender {  
  10.     protectedstatic Logger logger=LoggerFactory.getLogger(HelloSender.class);   
  11.     @Autowired
  12.     private AmqpTemplate rabbitTemplate;  
  13.     public
     String send(String name) {  
  14.         String context = "hello "+name+" --" + new Date();  
  15.         logger.debug("HelloSender: " + context);  
  16.         this.rabbitTemplate.convertAndSend("hello", context);  
  17.         return context;  
  18.     }  
  19. }  

3、編寫接受訊息類

在com.example包中增加類,名稱為HelloReceiver,並修改程式碼為

  1. package com.example;  
  2. import org.slf4j.Logger;  
  3. import org.slf4j.LoggerFactory;  
  4. import org.springframework.amqp.rabbit.annotation.RabbitHandler;  
  5. import org.springframework.amqp.rabbit.annotation.RabbitListener;  
  6. import org.springframework.stereotype.Component;  
  7. @Component  
  8. @RabbitListener(queues = "hello")  
  9. public class HelloReceiver {  
  10.     protected static Logger logger = LoggerFactory.getLogger(HelloReceiver.class);  
  11.     @RabbitHandler  
  12.     public void process(String hello) {  
  13.         logger.debug("HelloReceiver : " + hello);  
  14.     }  
  15. }  

4、編寫RestController,呼叫傳送訊息

在com.example包中增加類,名稱為HelloController,並修改程式碼為

  1. package com.example;  
  2. import org.slf4j.Logger;  
  3. import org.slf4j.LoggerFactory;  
  4. import org.springframework.beans.factory.annotation.Autowired;  
  5. import org.springframework.web.bind.annotation.PathVariable;  
  6. import org.springframework.web.bind.annotation.RequestMapping;  
  7. import org.springframework.web.bind.annotation.RestController;  
  8. @RestController
  9. publicclass HelloController {  
  10.     protectedstatic Logger logger=LoggerFactory.getLogger(HelloController.class);   
  11.     @Autowired
  12.         private HelloSender helloSender;  
  13.     @RequestMapping("/send/{name}")  
  14.     public String helloworld(@PathVariable String name) {  
  15.         return helloSender.send(name);  
  16.     }  
  17. }  

5、執行測試

A、啟動Docker中容器rabbitmq5672。docker start rabbitmq5672   (如果已啟動,則忽略)

B、啟動工程。在工程所在的資料夾開啟命令列,且在命令列中執行 mvn spring-boot:run

C、在瀏覽器中輸入 http://localhost:8080/send/上帝

瀏覽器中顯示

控制檯中顯示,成功傳送、接收訊息

三、小結

1、rabbitmq連線

1.1 springboot,在啟動時,根據系統配置檔案的引數建立一個rabbitmq連線。參看控制檯日誌:

 (MBeanExporter.java:431)- Registering beans for JMX exposure on startup

(MBeanExporter.java:916)- Bean with name 'rabbitConnectionFactory' has been autodetected for JMX exposure

 (MBeanExporter.java:678)- Located managed bean 'rabbitConnectionFactory': registering with JMX server as MBean [org.springframework.amqp.rabbit.connection:name=rabbitConnectionFactory,type=CachingConnectionFactory]

(DefaultLifecycleProcessor.java:343)- Starting beans in phase -2147482648

(DefaultLifecycleProcessor.java:343)- Starting beans in phase 2147483647

(AbstractConnectionFactory.java:347)- Created new connection: [email protected] [delegate=amqp://[email protected]:5672/, localPort= 62881]

1.2、在springboot啟動之後,檢視rabbitmq(http://localhost:15672/)的connections,也可以檢視到。當然,你也可以停止springboot去看連結(停止之後,當然就沒有連結了).
1.3、把logbak.xml的root的等級修改為debug,你會發現監聽在不斷的連結reabitmq;它就是一個心跳。通過這個心跳,rabbitmq也知道存在哪些監聽器在監聽那個佇列。

2、配置檔案

在配置檔案中,僅僅配置了一個名為hello的佇列。以後傳送、接收都與這個佇列相關。

3、傳送訊息

3.1、傳送訊息使用模板機制,用springboot自動注入的rabbitTemplate,它已經封裝好連結、管道、轉換等。

3.2、訊息轉換和傳送

void convertAndSend(String routingKey, Object message) throws AmqpException;

它的註釋是:Convert a Java object to an Amqp {@link Message} and send it to a default exchange with a specific routing key.

轉換一個Java物件為Amqp訊息,然後再用預設的交換機指定路由鍵傳送訊息。

4、接受訊息

4.1、監聽訊息

在類上宣告@RabbitListener(queues = "hello"),表示監聽hello佇列

4.2、訊息處理控制代碼

在接收處理訊息的方法上宣告@RabbitHandler

Annotation that marks a method to be the target of a Rabbit message  listener within a class that is annotated with {@link RabbitListener}.

5、印象

整個工程比較簡單,沒有什麼特殊的配置,僅僅三個類檔案即可實現訊息的傳送和接受。


相關推薦

SpringBoot的RabbitMQ訊息佇列: 訊息傳送接收第一印象

編制RabbitMQ配置、傳送、接受的程式碼 1、編寫配置檔案類 在com.example包中增加類,名稱為HelloRabbitConfig,並修改程式碼為 package com.example;   import org.springframework.amqp.core.Queue; 

百度Iot第一印象

之前對應物聯網平臺比較好奇,在工作上也使用了Tlink物聯網平臺,實現了裝置的聯網。但是糾結於雲平臺服務商是否能提供長久、穩定的服務,所以沒有在深入研究。 而對於自身能力而已,重頭到腳開發一套物聯網雲平臺,能力有限。因此再三選擇下,覺定試用百度的IoT物聯接入平臺。寫下部落

訊息佇列和消費確認

訊息到佇列 訊息傳送後,如何確定到訊息是否到達了相應的佇列?RabbitMQ預設在傳送訊息時,如果不能根據交換器型別和路由鍵找到相應的佇列,訊息將直接丟棄。而要想知道訊息是否達到佇列或沒到佇列卻不想訊息丟失,RabbitMQ提供有解決方案: 設定mandatory引數 為true時,

Windows訊息佇列執行緒訊息佇列,視窗訊息的概念與關係

1.視窗 Windows程式是由一系列的視窗構成的,每個視窗都有自己的視窗過程,視窗過程就是一個擁有有固定 Signature 的 C函式,具體格式如下: LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wPa

訊息佇列 (轉)

原文連結:訊息佇列(一) 一、訊息佇列概述 訊息佇列中介軟體是分散式系統中重要的元件,主要解決應用耦合、非同步訊息、流量削峰等問題。實現高效能、高可用、可伸縮和最終一致性架構,是大型分散式系統不可缺少的中介軟體。 目前生產環境中,使用較多的訊息佇列有Activ

Kafka訊息佇列介紹環境搭建及應用:C#實現消費者-生產者訂閱

一:kafka介紹 kafka(官網地址:http://kafka.apache.org)是一種高吞吐量的分散式釋出訂閱的訊息佇列系統,具有高效能和高吞吐率。 1.1 術語介紹 Broker Kafka叢集包含一個或多個伺服器,這種伺服器被稱為broker

常用訊息佇列對比選擇參考和訊息佇列認知

目錄: 1、訊息佇列之常用協議 1.1、AMQP 1.2、MQTT協議 1.3、STOMP協議 1.4、XMPP協議 2、訊息佇列之模型 3、訊息佇列的組成模組 4、常用訊息佇列介紹 4.1、RabbitMQ 4.2、ActiveMQ 4.3、Rocket

linux c程式設計:System V訊息佇列

訊息佇列可以認為是一個訊息連結串列,System V 訊息佇列使用訊息佇列識別符號標識。具有足 夠特權的任何程序都可以往一個佇列放置一個訊息,具有足夠特權的任何程序都可以從一個給定佇列讀出一個訊息。在某個程序往一個佇列寫入訊息之前,並不需要另外某個程序在該佇列上等待訊息的到達。System V 訊

RabbitMQ之訊息持久化(佇列持久化訊息持久化)

訊息的可靠性是RabbitMQ的一大特色,那麼RabbitMQ是如何保證訊息可靠性的呢——訊息持久化。  為了保證RabbitMQ在退出或者crash等異常情況下資料沒有丟失,需要將queue,exchange和Message都持久化。 queue的持久化 queue

SpringBoot的RabbitMQ訊息佇列: 三第二模式"Work queues"

    上一節的兩個工程,一個負責傳送,一個負責接收,也就是一一對於的關係。      只要訊息發出了,接收者就處理;當接收效率較低時,就會出現接收者處理不過來,我們就可能會處理不過來,於是我們就可能多配置接受者。這個模式就是"Work queues",它的結構如下   

程序間通訊機制(管道訊號共享記憶體/訊號量/訊息佇列執行緒間通訊機制(互斥鎖條件變數posix匿名訊號量)

(1)系統中每個訊號量的資料結構(sem)struct sem {     int semval; /* 訊號量的當前值 */     unsigned short  semzcnt;  /* # waiting for zero */     unsigned short  semncnt;  /* # w

redis 訊息佇列 釋出訂閱模式

向佇列中放入元素命令  lpush key value1 value2 value3,rpush  key value1 value2 value3; 從佇列中取元素命令  lpop  key;rpo

剖析nsq訊息佇列() 簡介及去中心化實現原理

分散式訊息佇列nsq,簡單易用,去中心化的設計使nsq更健壯,nsq充分利用了go語言的goroutine和channel來實現的訊息處理,程式碼量也不大,讀不了多久就沒了。後期的文章我會把nsq的原始碼分析給大家看。 主要的分析路線如下 分析nsq的整體框架結構,分析如何做到的無中心化分散式拓撲結構,如何

.NET Core使用App.Metrics監控訊息佇列():初探

一、簡介 App Metrics是一個開放原始碼和跨平臺的.NET庫,用於記錄應用程式中的指標。App Metrics可以在.NET Core或也支援.NET 4.5.2的完整.NET框架上執行。 App Metrics通過在記憶體中進行取樣和聚合,並提供可擴充套件性點以指定間隔將指標重新整理到儲存庫中,

網際網路面試開小灶系列之訊息佇列()

目錄 背景 為什麼使用訊息佇列 訊息佇列有什麼優缺點 訊息佇列的選型 重複消費你們是怎麼解決的? @(目錄) 背景 程式設計師不懂點訊息佇列的知識,怎麼能證明你

訊息佇列-篇讀懂rabbitmq(生命週期,confirm模式,延遲佇列,叢集)

  什麼是訊息佇列? 就是生產者生產一條訊息,傳送到這個rabbitmq,消費者連線rabbitmq並且進行消費,生產者和消費者並需要知道對方是如何工作的,從而實現程式之間的解耦,非同步和削峰,這也就是訊息佇列的作用。 使用的場景也有很多,比如使用者支付購買之後的傳送簡訊,增加使用者積分等等,只要能

【Visual C 】遊戲開發筆記十二 遊戲輸入訊息處理 鍵盤訊息處理

                ------------------------------------------------------------------------------------------------------------------------------淺墨歷時一年為遊戲程式設計

訊息佇列及常見訊息佇列介紹

一、訊息佇列(MQ)概述 訊息佇列(Message Queue),是分散式系統中重要的元件,其通用的使用場景可以簡單地描述為: 當不需要立即獲得結果,但是併發量又需要進行控制的時候,差不多就是需要使用訊息佇列的時候。 訊息佇列主要解決了應用耦合、

mq 訊息佇列 以及常見訊息佇列的介紹

一、訊息佇列(MQ)概述 訊息佇列(Message Queue),是分散式系統中重要的元件,其通用的使用場景可以簡單地描述為: 當不需要立即獲得結果,但是併發量又需要進行控制的時候,差不多就是需要使用訊息佇列的時候。 訊息佇列主要解決了應用耦合、非同步處理、流量削鋒等問題。

訊息佇列之非同步訊息基本概念以及ActiveMQ整合Spring常用用法介紹

一 簡介 (1)非同步訊息: 所謂非同步訊息,跟RMI遠端呼叫、webservice呼叫是類似的,非同步訊息也是用於應用程式之間的通訊。但是它們之間的區別是: RMI、Hession/Burlap、webservice等遠端呼叫機制是同步的。也就是說,當客戶端呼叫遠端方法時,客戶端