【Spring】使用Spring和AMQP發送接收消息(下)

為什么80%的碼農都做不了架構師?>>> ??hot3.png

上篇講了RabbitMQ連接工廠的作用是用來創建RabbitMQ的連接,本篇就來講講RabbitMQ的發送消息。通過RabbitMQ發送消息最簡單的方式就是將connectionFactory Bean注入到服務層類中,并使用它創建Connection,使用這個Connection來創建Channel,再使用這個Channel發布消息到Exchange中。

當然Spring AMQP提供了RabbitTemplate來簡便我們的操作,消除RabbitMQ發送和接收消息相關的樣板代碼。使用RabbitTemplate也是先在配置文件中寫相關的配置,使用Rabbit命名空間的<template>元素,如下:

<template id="rabbitTemplate" connection-factory="connectionFactory">

現在要發送消息只需要將模板bean注入到服務層類中(這里以SendServiceImpl為例),并使用它來發送Spittle,使用RabbitTemplate來發送Spittle提醒,代碼如下:

public class SendServiceImpl implements SendService {private RabbitTemplate rabbit;@Autowiredpublic SendServiceImpl (RabbitTemplate rabbit) {this.rabbit = rabbit;}public void sendSpittle (Spittle spittle) {rabbit.convertAndSend("spittle.test.exchange", "spittle.test", spittle);}
}

上面代碼中sendSpittle()調用RabbitTemplate的convertAndSend()方法,傳入的三個參數分別是Exchange的名稱、routing key以及要發送的對象。
這里如果使用最簡單的只傳要發送的對象的重載方法,RabbitTemplate就使用默認的Exchange和routing key。按之前配置的話,這兩項默認都為空,也可以自行在<template>元素上借助exchange和routing-key屬性配置不同的默認值:

<template id="rabbitTemplate" connection-factory="connectionFactory"exchange="spittle.test.exchange" routing-key="spittle.test" />

此外RabbitTemplate還有其他方法可以用來發送消息,比如用send()方法來發送org.springframework.amqp.core.Message對象,如下所示:

Message message = new Message("Hello World".getBytes(), new MessageProperties());
rabbit.send("hello.exchange", "hello.routing", message);

使用send()方法的技巧在于構造要發送的Message對象,在上面的例子中,通過給定字符串的字節數組來構建Message實例。這里是字符串相對比較簡單,如果消息是復雜對象的話,則會比較復雜。也是因為這樣,所以一般會用convertAndSend()方法,它會自動將對象轉換為Message,不過它需要一個消息轉換器來幫助完成該任務,默認的轉換器是SimpleMessageConverter,它適用于String、Serializable實例和字節數組。

發送消息完后,接下來就是接收消息了。
在傳統JMS中有兩種從隊列獲取信息的方式,使用JmsTemplate的同步方式以及使用消息驅動pojo的異步方式。Spring AMQP也提供了類似的方式來獲取通過AMQP發送的消息。

使用RabbitTemplate來接收消息

RabbitTemplate提供的接收信息的方法中最簡單的就是receive()方法,通過該方法就可以從隊列中獲取一個Message對象:

Message message = rabbit.receive("spittle.test.queue");

或者也可以通過配置獲取消息的默認隊列,這是通過在配置模板的時候,設置queue屬性實現的:

<template id="rabbitTemplate" connection-factory="connectionFactory"exchange="spittle.test.exchange" routing-key="spittle.test" queue="spittle.test.queue" />

這樣的話,在調用receive()方法時,不需要設置任何參數就能從默認隊列中獲取消息:

Message message = rabbit.receive( );

獲取到Message對象后,一般需要將它的body屬性中的字節數組轉換為想要的對象,就像在發送的時候將領域對象轉換為Message一樣,將接收到的Message轉換為領域對象也很繁瑣。這里可以考慮使用RabbitTemplate的receiveAndConvert()方法作為替代方案:

Spittle spittle = (Spittle) rabbit.receiveAndConvert("spittle.test.queue");

receiveAndConvert()方法會使用與sendAndConvert()方法相同的消息轉換器,將Message對象轉換為原始的類型。
調用receive()和receiveAndConvert()方法都會立即返回,如果隊列中沒有等待的消息,將會得到null。這時一般需要程序員自己管理輪詢以及必要的線程,實現隊列監控。如果不想每次都同步輪詢等待消息到達,可以使用Spring AMQP提供的消息驅動pojo,下面就看看使用消息驅動pojo的方式來接收消息。

使用消息驅動pojo來接收消息

如果想要在消息驅動pojo中異步地消費使用Spittle對象,先要解決這個pojo本身,如下的SpittleTestHandler扮演了這個角色:

public class SpittleTestHandler {public void handleSpittleTest (Spittle spittle) {...}
}

其實這個類并沒有依賴于AMQP,不管通過什么機制傳遞過來Spittle對象,它都能夠處理。
這里還需要在Spring應用上下文中將SpittleTestHandler聲明為一個bean:

<bean id="spittleListener"class="com.***.spittr.test.SpittleTestHandler">

最后要聲明一個監聽器容器和監聽器,當消息到達的時候,能夠調用SpittleTestHandler,配置如下:

<listener-container connection-factory="connectionFactory"><listener ref="spittleListener" method="handleSpittleTest"queue-names="spittle.test.queue" />
</listener-container>

上面的<listener-container>與<listener>元素都來自rabbit命名空間。并通過queue-names屬性來指定要監聽的隊列,這里只設定了一個要監聽的隊列,如果要設置多個隊列的話,用逗號隔開。到這里消息接收就完成了,拿到消息后就可以在相應方法里執行相應處理了,使用AMQP發送接收消息就講解到此了。

轉載于:https://my.oschina.net/hin911/blog/862645

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

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

相關文章

微軟u盤安裝工具_使用微軟Winget工具安裝軟件教程

對于系統管理員來說&#xff0c;一款好用的軟件包管理工具可以大大提高安裝、部署、管理軟件的效率。可之前只有 MscOS 和 Linux 官方才有軟件包管理工具&#xff0c;微軟官方現在終于為Windows系統發布了一款名為Winget的軟件包管理工具&#xff0c;MS酋長下面就來為大家演示一…

ZOJ2930 The Worst Schedule(最小割)

題目大概說有n個任務&#xff0c;每個任務可以提前或推遲&#xff0c;提前或推遲各有一定的費用&#xff0c;有的任務一旦推遲另一個任務也必須推遲&#xff0c;問怎么安排任務使花費最少&#xff0c;且最少花費的條件下提前的任務數最多能多少。 問題就是要把各個任務分成兩個…

為什么要free釋放內存_為什么在Free Code Camp上列出一份工作要花1,000美元?

為什么要free釋放內存by Michael D. Johnson邁克爾約翰遜(Michael D.Johnson) 為什么在Free Code Camp上列出一份工作要花1,000美元&#xff1f; (Why does it cost $1,000 to list a job on Free Code Camp?) I’ve recently spoken with employers looking for JavaScript …

python訪問注冊表_讀取注冊表的Python代碼

如果“Uninstall”中有超過1024個子鍵怎么辦&#xff1f;Use _winreg.QueryInfoKey(key)Python2:import errno, os, _winregproc_arch os.environ[PROCESSOR_ARCHITECTURE].lower()proc_arch64 os.environ[PROCESSOR_ARCHITEW6432].lower()if proc_arch x86 and not proc_ar…

ios 動畫 隱藏tabbar_UITabBarViewController 的底部 tabBar 隱藏

iOS pushViewController 時候隱藏 TabBar 的可以用interfaceUIViewController (UINavigationControllerItem)property(nonatomic,readonly,strong)UINavigationItem*navigationItem;// Created on-demand so that a view controller may customize its navigation appearance.p…

JS進階之---函數,立即執行函數

一、函數 函數聲明、函數表達式、匿名函數 函數聲明&#xff1a;使用function關鍵字聲明一個函數&#xff0c;再指定一個函數名&#xff0c;叫函數聲明。function name () { … } 函數表達式&#xff1a;使用function關鍵字聲明一個函數&#xff0c;但未給函數命名&#xff0c;…

主線程中有多個handler的情況

https://www.cnblogs.com/transmuse/archive/2011/05/16/2048073.html轉載于:https://www.cnblogs.com/genggeng/p/9806415.html

RandomForestClassifier(隨機森林檢測每個特征的重要性及每個樣例屬于哪個類的概率)...

#In the next recipe, well look at how to tune the random forest classifier. #Lets start by importing datasets:from sklearn import datasets X, y datasets.make_classification(1000)# X(1000,20) #y(1000) 取值范圍【0,1】from sklearn.ensemble import RandomFores…

單因素方差分析_基于R語言開展方差分析(一)——單因素方差分析

基本原理方差分析(Analysis of variance, ANOVA)是用于兩個或兩個以上樣本均數比較的方法&#xff0c;還可以分析兩個或多個研究因素的交互交互作用以及回歸方程的線性假設檢驗等。其基本思想是將全部觀察值間的變異——總變異按設計和需要分解成兩個或多個組成部分&#xff0c…

個稅10% 人群_人群管理如何使我們的搜索質量提高27%

個稅10% 人群by Thanesh Sunthar由塔內什桑塔爾(Thanesh Sunthar) 人群管理如何使我們的搜索質量提高27&#xff05; (How Crowd Curation Improved Our Search Quality by 27%) The bigger your platform gets, the more vital search becomes. And if you run a content-hea…

mysql增數據語句_Mysql 數據增刪改查語句

插入數據 insert#1. 插入完整數據(順序插入)#語法一&#xff1a;insert into 表名(字段1,字段2,字段3…字段n) values (值1,值2,值3…值n);#語法二&#xff1a;insert into 表名 values (值1,值2,值3…值n);#2. 指定字段插入數據#語法&#xff1a;insert into 表名(字段1,字段2…

Python+Flask.0010.FLASK即插視圖之自定義視圖類及修飾器

2019獨角獸企業重金招聘Python工程師標準>>> 即插視圖; 說明: FLASK的視圖靈感來自于DJANGO的基于類而非基于函數的通用視圖,主要目的是為了解決多個視圖函數之間已經實現的部分,通過類繼承的方式繼承到其它視圖,總之為了一點,就是少寫代碼,然后通過add_url_rule讓我…

InputStream和Reader,FileInputStream和 FileReader的區別

一、InputStream和Reader的區別 InputStream和Reader都可以用來讀數據(從文件中讀取數據或從Socket中讀取數據)&#xff0c;最主要的區別如下: InputStream用來讀取二進制數(字節流)&#xff0c;而 Reader用來讀取文本數據&#xff0c;即 Unicode字符。那么二進制數與文本數據有…

NGUI之輸入文本框的使用

ToolBar中的兩個紅圈 另&#xff0c;代碼如下&#xff1a;只需要定義一個變量即可&#xff0c;然后將控件drag到那里&#xff0c;真的是灰常方便呀 還有一個就是保存了&#xff08;OK的響應&#xff09;,可以簡單地理解為存檔或讀檔 轉載于:https://www.cnblogs.com/YTYMblog/p…

ae制作數據可視化_我如何精心制作真正可怕的數據可視化

ae制作數據可視化by Krist Wongsuphasawat克里斯特旺蘇帕薩瓦(Krist Wongsuphasawat) 我如何精心制作真正可怕的數據可視化 (How I carefully crafted a truly terrible data visualization) Yes, you read that right. I am going to explain how I put together a really ba…

tensorrt輕松部署高性能dnn推理_實戰教程:TensorRT中遞歸神經網絡的介紹(中文字幕)...

NVIDIA TensorRT是一個高性能的深度學習推理優化器和運行時&#xff0c;它提供低延遲和高吞吐量。TensorRT可以從每個深度學習框架導入經過訓練的模型&#xff0c;從而輕松地創建可以集成到大型應用程序和服務中的高效推理引擎。這個視頻的五個關鍵點:1.TensorRT支持RNNv2, Mat…

w怎么接顯示 樹莓派zero_純干貨!一根線玩轉樹莓派ZeroW(圖文教程,親測有效)...

#一、寫在前面本文旨在介紹如何用最少的外設(成本)完成樹莓派Zero W最基礎最重要的功能。注意&#xff1a;本文原始發表時官方鏡像版本是2017-04-10的&#xff0c;在2019年5月10日有網友提出本方案已經不完全適用最新的鏡像了&#xff0c;所以如果只是想按照本文所提出的步驟一…

十進制小數轉換二進制的問題

2019獨角獸企業重金招聘Python工程師標準>>> 整數和小數分別轉換。 整數除以2&#xff0c;商繼續除以2&#xff0c;得到0為止&#xff0c;將余數逆序排列。 22 / 2 11 余0 11/2 5 余 1 5 /2 2 余 1 2 /2 1 余 0 1 /2 0 余 1 所以22的二進制…

java操作mongodb(連接池)(轉)

原文鏈接&#xff1a; java操作mongodb&#xff08;連接池&#xff09; Mongo的實例其實就是一個數據庫連接池&#xff0c;這個連接池里默認有10個鏈接。我們沒有必要重新實現這個鏈接池&#xff0c;但是我們可以更改這個連接池的配置。因為Mongo的實例就是一個連接池&#xff…

機器學習 一年入門_我作為自我入門程序員的一年回顧

機器學習 一年入門by Alin Rauta通過Alin Rauta 我作為自我入門程序員的一年回顧 (My Year as a Self-starter Programmer in Review) This was the most crucial year for my personal development ever. It was hard. Really hard. That’s why for me, the key word of 201…