消息中間件——RabbitMQ(五)快速入門生產者與消費者,SpringBoot整合RabbitMQ!

前言

本章我們來一次快速入門RabbitMQ——生產者與消費者。需要構建一個生產端與消費端的模型。什么意思呢?我們的生產者發送一條消息,投遞到RabbitMQ集群也就是Broker。
我們的消費端進行監聽RabbitMQ,當發現隊列中有消息后,就進行消費。

1. 環境準備

本次整合主要采用SpringBoot框架,需要對SpringBoot的使用有一定了解。

2.大概步驟

我們來看下大概步驟:

  • ConnectionFacorty:獲取連接工廠
  • Connection:一個連接
  • Channel:數據通信信道,可發送和接收消息
  • Queue:具體的消息存儲隊列
  • Producer & Consumer 生產者和消費者

這個連接工廠需要配置一些相應的信息,例如: RabbitMQ節點的地址,端口號,VirtualHost等等。
Channel是我們RabbitMQ所有消息進行交互的關鍵。

3. 項目實戰

3.1 連接工廠


public class ConnectionUtils {public static Connection getConnection() throws IOException, TimeoutException {//定義連接工廠ConnectionFactory factory = new ConnectionFactory();//設置服務地址factory.setHost("127.0.0.1");//端口factory.setPort(5672);//amqp協議 端口 類似與mysql的3306//設置賬號信息,用戶名、密碼、vhostfactory.setVirtualHost("/vhost_cp");factory.setUsername("user_cp");factory.setPassword("123456");// 通過工程獲取連接Connection connection = factory.newConnection();return connection;}
}

3.2 生產端


public class Producer {public static void main(String[] args) throws Exception {System.out.println("Producer start...");//1 創建ConnectionFactoryConnection connection = ConnectionUtils.getConnection();//2 通過connection創建一個ChannelChannel channel = connection.createChannel();//3 通過Channel發送數據
for(int i=0; i < 5; i++){String msg = "Hello RabbitMQ!";//1 exchange   2 routingKey channel.basicPublish("", "test001", null, msg.getBytes());}//4 記得要關閉相關的連接channel.close();connection.close();}
}

3.3 消費端


public class Consumer {public static void main(String[] args) throws Exception {System.out.println("Consumer start...");//1 創建ConnectionFactoryConnection connection = ConnectionUtils.getConnection();//2通過connection創建一個ChannelChannel channel = connection.createChannel();//3聲明(創建)一個隊列String queueName = "test001";channel.queueDeclare(queueName, true, false, false, null);//4創建消費者QueueingConsumer queueingConsumer = new QueueingConsumer(channel);//5設置Channelchannel.basicConsume(queueName, true, queueingConsumer);while(true){//6 獲取消息Delivery delivery = queueingConsumer.nextDelivery();String msg = new String(delivery.getBody());System.err.println("消費端: " + msg);//Envelope envelope = delivery.getEnvelope();}}
}

3.4 源碼解析


channel.queueDeclare(queueName, true, false, false, null);

第一個參數:queue:隊列的名稱
第二個參數:durable 是否持久化。true消息會持久化到本地,保證重啟服務后消息不會丟失
第三個參數:exclusive :表示獨占方式,設置為true 在某些情景下有必要,例如:順序消費。表示只有一個channel可以去監聽,其他channel都不能夠監聽。目的就是為了保證順序消費。
第四個參數:autoDelete:隊列如果與Exchange未綁定,則自動刪除
第五個參數:arguments:擴展參數


channel.basicConsume(QUEUE_NAME, true, consumer);

第二個參數 autoAck:自動簽收消息

3.5 運行程序

(1)啟動消費端

(2)查看管控臺

可以看到已經有一個連接,一個信道,一個消費者等信息了。

可以看到信道目前的狀態是空閑狀態。

隊列中多了test001隊列。

關于管控臺的介紹可以看這篇文章:消息中間件——RabbitMQ(四)命令行與管控臺的基本操作!

(3)運行生產端

可以看到生產端發送完消息之后停下了,消費端迅速接收到了消息。也可以繼續通過管控臺觀察消費的情況。

(4) 問題

注意:

這里面可能有一個問題:為什么要先啟動消費端呢?

因為在消費端創建的隊列,我們必須要有隊列,才能夠發送消息。

另一個問題:在生產端代碼中:


channel.basicPublish("", "test001", null, msg.getBytes());

并沒有設置exchange,只設置了隊列名稱,消費端卻依然能夠消費到消息,這是為什么呢?

答:發消息的一定要指定Exchange,如果不指定Exchange或者Exchange為空的話,它會默認走第一個


它的路由規則:將相同命名的隊列Queue的消息路由過去,如果路由不過去,將會把消息刪除。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/164043.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/164043.shtml
英文地址,請注明出處:http://en.pswp.cn/news/164043.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

森利威爾SL4010 升壓恒壓 12V升壓24V 12V升壓36V 12V升壓48V

在當今的電子設備中&#xff0c;電源管理系統的設計是非常重要的。為了保證設備的穩定運行&#xff0c;升壓和恒壓電源的應用已經成為不可或缺的一部分。在這篇文章中&#xff0c;我們將介紹森利威爾SL4010升壓恒壓電源&#xff0c;它可以實現12V升壓24V、12V升壓36V、12V升壓4…

c 在文本終端中顯示yuv圖片

把yuv422 轉為rgb32 &#xff0c;利用framebuffer 顯示 #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdlib.h> #include <unistd.h> #include <sys/ioctl.h> #include <lin…

vue2.6源碼分析

vue相關文檔 vue-cli官方文檔 vuex官方文檔 vue-router 官方文檔 vue2.6源碼地址 如何調試源碼 package.json 添加了--sourcemap "scripts": {"dev": "rollup -w -c scripts/config.js --environment TARGET:web-full-dev --sourcemap" }新增…

linux apt update錯誤提示修復

錯誤提示&#xff1a; E: Release file for http://security.debian.org/dists/bullseye-security/InRelease is expired (invalid since 15d 14h 45min 26s). Updates for this repository will not be applied. E: Release file for http://ftp.jp.debian.org/debian/dists/b…

【Hello Go】Go語言并發編程

并發編程 概述基本概念go語言的并發優勢 goroutinegoroutine是什么創建goroutine如果主goroutine退出runtime包GoschedGoexitGOMAXPROCS channel無緩沖的channel有緩沖的channelrange和close單向channel 定時器TimerTicker Select超時 概述 基本概念 并行和并發概念 并行 &…

CVE-2023-6099:優卡特臉愛云一臉通智慧管理平臺SystemMng.ashx接口未授權漏洞復現

文章目錄 優卡特臉愛云一臉通智慧管理平臺未授權SystemMng.ashx接口漏洞復現&#xff08;CVE-2023-6099&#xff09; [附POC]0x01 前言0x02 漏洞描述0x03 影響版本0x04 漏洞環境0x05 漏洞復現1.訪問漏洞環境2.構造POC3.復現 0x06 修復建議 優卡特臉愛云一臉通智慧管理平臺未授權…

mysql字符串轉為數字的三種方法、字符串轉日期

隱式轉換 在MySQL中&#xff0c;使用0運算符可以將一個非數字的值隱式地轉換為數字。這在進行數學運算或比較操作時非常有用。 需要注意的是&#xff0c;在使用0進行隱式轉換時&#xff0c;MySQL會盡可能將字符串轉換為數字。如果字符串不能轉換為數字&#xff0c;則會返回0。…

【解決】HDFS JournalNode啟動慢問題排查

文章目錄 一. 問題描述二. 問題分析1. 排查機器性能2. DNS的問題 三. 問題解決 一句話&#xff1a;因為dns的問題導致journalnode啟動時很慢&#xff0c;通過修復dns對0.0.0.0域名解析&#xff0c;修復此問題。 一. 問題描述 從journalnode啟動到服務可用&#xff0c;完成RPC…

使用Python將圖片轉換為PDF

將圖片轉為 PDF 的主要原因之一是為了方便共享和傳輸。此外&#xff0c;將多張圖片合并成一個 PDF 文件還可以簡化文件管理。之前文章詳細介紹過如何使用第三方庫Spire.PDF for Python將PDF文件轉為圖片&#xff0c;那么本文介紹使用同樣工具在Python中實現圖片轉PDF文件的功能…

【OpenCV+OCR】計算機視覺:識別圖像驗證碼中指定顏色文字

文章目錄 1. 寫在前面2. 讀取驗證碼圖像3. 生成顏色掩碼4. 生成黑白結果圖5. OCR文字識別6. 測試結果 【作者主頁】&#xff1a;吳秋霖 【作者介紹】&#xff1a;Python領域優質創作者、阿里云博客專家、華為云享專家。長期致力于Python與爬蟲領域研究與開發工作&#xff01; 【…

Spring Security(安全框架,必須登錄成功才能訪問指定資源)

一、背景知識 1、Spring Security 是一個能夠為基于Spring的企業應用系統提供聲明式的安全訪問控制解決方案的安全框架。它提供了一組可以在Spring應用上下文中配置的Bean&#xff0c;充分利用了Spring IoC&#xff0c;DI&#xff08;IOC: 控制反轉Inversion of Control ,DI:D…

24路電磁鎖控板的特點和主要參數

智能快遞柜、智能生鮮柜、電子存儲柜、超市寄存柜、智能送餐柜、電子更衣柜、檔案柜等物聯網終端設備&#xff0c;都是采用電磁鎖控制&#xff0c;這種電磁鎖控制板俗稱鎖控板。鎖控板可以遠程控制儲物柜的開關以及遠程監控并提供鎖的反饋信號。沐渥開發的24路電磁鎖控板可以控…

AI:87-基于深度學習的街景圖像地理位置識別

?? 本文選自專欄:人工智能領域200例教程專欄 從基礎到實踐,深入學習。無論你是初學者還是經驗豐富的老手,對于本專欄案例和項目實踐都有參考學習意義。 ??? 每一個案例都附帶有在本地跑過的代碼,詳細講解供大家學習,希望可以幫到大家。歡迎訂閱支持,正在不斷更新中,…

OpenAI 曾收到 AI 重大突破警告;半獨立的 OpenAI 比與微軟合并更好丨 RTE 開發者日報 Vol.91

開發者朋友們大家好&#xff1a; 這里是 「RTE 開發者日報」 &#xff0c;每天和大家一起看新聞、聊八卦。我們的社區編輯團隊會整理分享 RTE &#xff08;Real Time Engagement&#xff09; 領域內「有話題的 新聞 」、「有態度的 觀點 」、「有意思的 數據 」、「有思考的 文…

ubuntu下docker環境使用GPU配置

本文主要講述整個命令流程&#xff0c;具體講解請看官網nvidia-容器工具包和一篇總結得很詳細的博文docker使用GPU總結 docker的版本必須安裝19.0版本以上的&#xff0c;這里也只講19.0版本以上的使用方法 首先設置一下網絡信息 curl -fsSL https://nvidia.github.io/libnvi…

LeetCode131. Palindrome Partitioning

文章目錄 一、題目二、題解 一、題目 Given a string s, partition s such that every substring of the partition is a palindrome . Return all possible palindrome partitioning of s. Example 1: Input: s “aab” Output: [[“a”,“a”,“b”],[“aa”,“b”]] Exa…

工具【1、計算時間差2、獲取當天時間前后七天時間3、根據當前數據的位置,在數組中插入數據4、數組中,某個屬性相同的數據放在一塊,如把某個日期相同的相連一起】

生成UUID /*** 唯一的隨機字符串&#xff0c;用來區分每條數據* returns {string}*/ export function getUid() {return xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx.replace(/[xy]/g, (c) > {const r (Math.random() * 16) | 0;const v c x ? r : (r & 0x3) | 0x8;retu…

【圖文詳解】SiamFC++與圖注意力的強強聯合:單目標追蹤系統

1.研究背景與意義 隨著計算機視覺技術的不斷發展&#xff0c;單目標追蹤&#xff08;Single Object Tracking, SOT&#xff09;作為計算機視覺領域的一個重要研究方向&#xff0c;已經在許多實際應用中得到了廣泛的應用。單目標追蹤系統可以通過分析視頻序列中的目標運動&…

服務器流量包扣減規則

服務器買的流量包,一般指的是上行帶寬,下行通常是不限的 上行和下行是針對服務器而言的 客戶端上傳文件給服務器,對服務器而言它是在下載,所以對服務器而言他是用的下行帶寬(下行流量) 客戶端從服務器下載文件,對服務器而言它是在上傳,所以對服務器而言他是用的上行帶寬(上行…

大數據量條件SQL查詢內存處理方案以及數據過濾算法優化

MySQL是一個廣泛使用的關系型數據庫管理系統。通過SQL語言進行數據操作和查詢&#xff0c;還支持多用戶、多線程和分布式操作等功能。 在實際使用中&#xff0c;我們會遇到各種查詢條件&#xff0c;如字段名、表名、邏輯運算符、比較運算符、函數等。其中&#xff0c;有些查詢…