Rabbitmq消息推送功能實現(xiàn)示例
一.前言
1.1場景
在我們實際開發(fā)中到一個特定的時候是比如工作流到某個狀態(tài)時, 我們會向某某單位發(fā)送消息, 這時就會用到我們的消息推送---rabbitmq
簡單畫一下:
1.2消息交換機三種形式
首先我們了解下消息隊列是由交換機exchange和隊列組合構成的,有三種形式
- 直連型:一個交換機關聯(lián)一個隊列,指定一個路由key,消息通過交換機名稱和路由key發(fā)送到指定隊列,發(fā)送一個,隊列里面就多一個消息。
- 扇型:一個交換機關聯(lián)多個隊列。消息通過交換機名稱發(fā)送,所有關聯(lián)了這個交換機的隊列都將收到消息,發(fā)送一個消息再N個消息隊列產生N個一模一樣的消息數(shù)據(jù)。
- 主題型:一個交換機根據(jù)規(guī)則關聯(lián)多個隊列。這種類型與扇型的很像,但是主題型會根據(jù)動態(tài)路由key決定消息的投遞到哪個隊列。這里的路由規(guī)則很像正則表達式。會根據(jù)事先設定的路由規(guī)則動態(tài)將消息投遞到隊列,可能投遞到一個隊列也可能投遞到多個隊列。
二.建設demo工程
2.1依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
2.2yml文件指定rabbitmq連接信息
server:
port: 8021
spring:
#給項目來個名字
application:
name: rabbitmq-provider
#配置rabbitMq 服務器
rabbitmq:
host: localhost
port: 5672
#確認消息已發(fā)送到交換機(Exchange)
publisher-confirm-type: correlated
#確認消息已發(fā)送到隊列(Queue)
publisher-returns: true
注意:我們需要創(chuàng)建兩個工程,一個生產者producer
、一個消費者comsumer
,生產者用來生產消息,消費者用來消費生產者將消息投遞到rabbitmq中的消息。
兩個工程中的pom依賴一樣,yml也一樣,只需要將server.port
設置成不同的端口即可。這里我們將生產者設置為8021
端口,消費者設置為8022
端口。
2.3直連型消息鏈接
從上面的講解中我們知道,有交換機exchange
,有隊列queue
,有路由routing
,因此我們需要在生產者端將三者關聯(lián)起來,然后發(fā)送消息,這樣消費端才能收到消息。
創(chuàng)建config工作類綁定關聯(lián)
@Configuration public class Config { public static String directRouting = "directRouting"; public static String directQueue = "directQueue"; public static String directExchange = "directExchange"; @Bean public Queue DirectQueue() { return new Queue(Config.directQueue,true); //true 是否持久 } @Bean DirectExchange DirectExchange() { return new DirectExchange(Config.directExchange); } @Bean Binding bindingDirect() { // BindingBuilder.bind(隊列A).to(交換機B).with(路由) 將隊列A綁定到交換機B,使用路由C傳遞消息 return BindingBuilder.bind(DirectQueue()).to(DirectExchange()).with(directRouting); }
發(fā)送消息
@Autowired private RabbitTemplate rabbitTemplate; //使用RabbitTemplate,這提供了接收/發(fā)送等等方法 @GetMapping("/sendDirectMsg") public String sendMsg() { Map<String,Object> map=new HashMap<String,Object>(); map.put("id",UUID.randomUUID().toString()); map.put("data","hello,i am direct msg!"); map.put("datetime",System.currentTimeMillis()); //交換機 路由 消息(發(fā)送消息的時候不需要管隊列,因為隊列已經在DirectRabbitConfig中配置了,隊列應該是消費者關心的事情) rabbitTemplate.convertAndSend(DirectRabbitConfig.directExchange, DirectRabbitConfig.directRouting, map); return "ok"; }
第二個工程中: 接收消息
@Component @RabbitListener(queues = "directQueue")//監(jiān)聽的隊列名稱 directQueue,不需要管路由和交換機,因為這些是生產者管理的事情。消費者只需要關心隊列即可 public class DirectReceiver { @RabbitHandler public void handler(Map testMessage) { System.out.println("directReceiver消費者收到消息 : " + testMessage.toString()); } }
到此這篇關于Rabbitmq消息推送功能實現(xiàn)示例的文章就介紹到這了,更多相關Rabbitmq消息推送內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringCloud @FeignClient參數(shù)的用法解析
這篇文章主要介紹了SpringCloud @FeignClient參數(shù)的用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10詳解在Spring?Boot中使用數(shù)據(jù)庫事務
本篇文章主要介紹了詳解在Spring?Boot中使用數(shù)據(jù)庫事務,具有一定的參考價值,感興趣的小伙伴們可以參考一下<BR>2017-05-05spring cloud gateway 限流的實現(xiàn)與原理
這篇文章主要介紹了spring cloud gateway 限流的實現(xiàn)與原理,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-12-12關于RedisTemplate之opsForValue的使用說明
這篇文章主要介紹了關于RedisTemplate之opsForValue的使用說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06SpringBoot整合Mybatis之各種查詢、模糊查詢、批量刪除、動態(tài)表名操作
這篇文章主要介紹了SpringBoot整合Mybatis之各種查詢、模糊查詢、批量刪除、動態(tài)表名,本文結合示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-12-12Spring?Security權限想要細化到按鈕實現(xiàn)示例
這篇文章主要為大家介紹了Spring?Security權限想要細化到按鈕實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-07-07詳解Mybatis攔截器安全加解密MySQL數(shù)據(jù)實戰(zhàn)
本文主要介紹了Mybatis攔截器安全加解密MySQL數(shù)據(jù)實戰(zhàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01