在SpringBoot中对RabbitMQ三种使用方式

基于API的方式

        1.使用AmqpAdmin定制消息发送组件

     @Autowiredprivate AmqpAdmin amqpAdmin;@Testpublic void amqpAdmin(){//1.定义fanout类型的交换器amqpAdmin.declareExchange(new FanoutExchange("fanout_exchange"));//2.定义两个默认持久化队列,分别处理email和smsamqpAdmin.declareQueue(new Queue("fanout_queue_email"));amqpAdmin.declareQueue(new Queue("fanout_queue_sms"));//3.将队列分别与交换器进行绑定//               队列名             是队列                                 交换机的名称           路由         其它参数amqpAdmin.declareBinding(new Binding("fanout_queue_email",Binding.DestinationType.QUEUE,"fanout_exchange","",null));amqpAdmin.declareBinding(new Binding("fanout_queue_sms",Binding.DestinationType.QUEUE,"fanout_exchange","",null));}

    

   

2.消息发送者发送消息

             创建实体类

                

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {private Integer id;private String name;}

                发送消息

 

    @Autowiredprivate RabbitTemplate re;@Test//消息发送者public void subPublisher(){User user = new User(1,"小满");re.convertAndSend("fanout_exchange", "", user);}

                        如图所以,如果我们直接发送的话就会报这个错,有两种解决方法,第一种是比较常用的让实体类User实现序列化Serializable接口,这里我们不做演示,第二种是写一个配置类,只有在RabbitMQ可以使用

import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class RabbitMQConfig {//定制JSON格式的消息转化器@Beanpublic MessageConverter messageConverter(){return new Jackson2JsonMessageConverter();}}

        加上配置类后我们发送就不会报错了,我们也可以在RabbitMQ的可视化端口看到我们发送的消息

 

 

        3.发送完消息后接下来就是消费消息了,定义接收消息的业务

import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Service;@Service
public class RabbitMQService {//发布订阅模式: @RabbitListener可以指定当前方法监控哪一个队列@RabbitListener(queues = "fanout_queue_email")//消费者可以消费多个队列的消息 public void subConsumerEmail(Message message){//当队列中有内容是方法会自动执行   推荐Object来接收//官网推荐Messagebyte[] body = message.getBody();//Message将数据存放在body中String msg = new String(body);System.out.println("邮件业务接收到消息:"+msg);}@RabbitListener(queues = "fanout_queue_sms") public void subConsumerSms(Message message){byte[] body = message.getBody();String msg = new String(body);System.out.println("短信业务接收到消息:"+msg);}
}

        4.重新运行发送端就可以接收到我们发送的数据,接收的数据可能打印在任意一个控制台中,这是idea的机制,我们不需要管 

基于配置类的方式

        1.在config配置类中定义


import org.springframework.amqp.core.*;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class RabbitMQConfig {//定制JSON格式的消息转化器@Beanpublic MessageConverter messageConverter(){return new Jackson2JsonMessageConverter();}// 1.fanout创建一个交换机@Beanpublic Exchange fanoutExchange(){return ExchangeBuilder.fanoutExchange("fanout_exchange").build();}//2.定义消息队列@Beanpublic Queue fanoutQueueEmail(){return new Queue("fanout_queue_email");}@Beanpublic Queue fanoutQueueSms(){return new Queue("fanout_queue_sms");}//3.将创建的队列绑定到对应的交换机上@Beanpublic Binding bingingEmail(){return BindingBuilder.bind(fanoutQueueEmail()).to(fanoutExchange()).with("").noargs();}@Beanpublic Binding bingingSms(){return BindingBuilder.bind(fanoutQueueSms()).to(fanoutExchange()).with("").noargs();}}

        2.为了避免api的影响,我们可以在可视化端口将基于api创建的交换机和队列删除

                1)删除交换机

 

 

                2)删除队列,前面也是点击队列的名字 

        可以看到我已经将交换机和消息队列都已经删除,接下来我们重新启动项目 ,配置类可以在启动的时候自动创建

 

         我们的订阅发布模式也是可以正常运行

        

基于注解类的方式        

        1.我们要现将基于配置类的方式注释掉,避免影响我们测试

import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Service;@Service
public class RabbitMQService { @RabbitListener(bindings = @QueueBinding(value = @Queue("fanout_queue_email"),exchange=@Exchange(value = "fanout_exchange",type = "fanout")))public void subConsumerEmail(Message message){//当队列中有内容是方法会自动执行   推荐Object来接收//官网推荐Messagebyte[] body = message.getBody();//Message将数据存放在body中String msg = new String(body);System.out.println("邮件业务接收到消息:"+msg);}@RabbitListener(bindings = @QueueBinding(value = @Queue("fanout_queue_sms"),exchange=@Exchange(value = "fanout_exchange",type = "fanout")))public void subConsumerSms(Message message){byte[] body = message.getBody();String msg = new String(body);System.out.println("短信业务接收到消息:"+msg);}
}

        提前将交换机和队列删除,然后运行,就会发现会在启动时会自动生成交换机和队列,测试也不会有影响

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/529.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

macOS 怎么安装redis数据库

1 访问redis数据库下载网址 http://download.redis.io/releases/ 访问上述的redis下载的网址,确定你想要的版本 然后下载即可 (我选则的是6.2.6) 然后下载 下载后 把这个文件解压,放在自己想要放在的位置 2 打开终端 输入对应的…

MyBatis查询数据库(1)

前言🍭 ❤️❤️❤️SSM专栏更新中,各位大佬觉得写得不错,支持一下,感谢了!❤️❤️❤️ Spring Spring MVC MyBatis_冷兮雪的博客-CSDN博客 经过前⾯的学习咱们 Spring 系列的基本操作已经实现的差不多了&#xff0…

论文浅尝 | 少样本学习的语言模型的持续训练

笔记整理:王贵涛,东南大学硕士,研究方向为自然语言处理 链接:https://github.com/UIC-Liu-Lab/CPT 一、动机 克服灾难性遗忘(CF)是持续学习(CL)的一个主要目标。目前有许多方法&…

物流企业「营销服」数字化转型,看这篇文章就够了

物流和供应链企业不仅和生产环节紧密相连,还与消费者需求息息相关,通过高度整合和融合运输、仓储、分拨、配送、信息等服务功能,为延伸产业链、提升价值链、构建供应链提供了关键支持。物流企业在推进现代流通体系、促进国内市场强大发展、推…

Linux —— 进程介绍

目录 一,进程介绍 二,进程使用 进程查看 通过系统调用获取进程标识符 通过系统调用创建进程 fork 一,进程介绍 进程是正在执行的程序或命令,每个进程都是一个运行的实体或程序的执行实例,有自己的地址空间&#x…

Win10,WinServer16,DNS,Web ,域 环境配置 周总结 (温故而知新 可以为师矣 第十五课)

Win10,WinServer16,DNS,Web ,域 环境安装 (第十五课) 创建虚拟机安装windowserver2016服务器(NETBASE第二课)_星辰镜的博客-CSDN博客 创建台虚拟机并安装上window10系统(NETBASE 第一课)_window 虚拟机_星辰镜的博客-CSDN博客配置通过域名访问网站(NET…

40.RocketMQ之高频面试题大全

消息中间件如何选型 RabbitMQ erlang开发,对消息堆积的支持并不好,当大量消息积压的时候,会导致 RabbitMQ 的性能急剧下降。每秒钟可以处理几万到十几万条消息。 RocketMQ java开发,面向互联网集群化功能丰富,对在线业…

行业追踪,2023-07-10,汽车零部件如期调整,需要耐心等待第二波

自动复盘 2023-07-10 成交额超过 100 亿 排名靠前,macd柱由绿转红 成交量要大于均线 有必要给每个行业加一个上级的归类,这样更能体现主流方向 rps 有时候比较滞后,但不少是欲杨先抑, 应该持续跟踪,等 macd 反转时参与…

input输入日期时间,自动格式化组件/工具

input输入日期时间,自动格式化组件/工具 组件/工具使用说明 只能输入日期时间,不能选择日期时间格式 yyyy-MM-dd HH:mm:ss基于VUE框架输入效果见下图 组件/工具解决的痛点 组件库日期时间组件,选日期时间很花时间 例如想快速得到 2021-1…

golang关于成员变量使用:=

错误 错误原因 结构体成员变量不能与:一起用,这是一个语法错误。

C#(五十八)之C#List

前几天&#xff0c;看同事写的代码中有list相关的字眼&#xff0c;百度了一下&#xff0c;原来是C#中list泛型集合。 了解一下。 List&#xff1a;泛型集合&#xff0c;List<T>类是 ArrayList 类的泛型等效类。该类使用大小可按需动态增加的数组实现 IList<T> 泛型…

arcgis拓扑检查

不能有悬挂点 不能有伪结点***路网处理很重要&#xff0c;看研究吧。 一直默认到最后。 导入要素类&#xff0c;单个 toupu2右键新建拓扑&#xff08;T&#xff09; 一般选不能有悬挂点&#xff0c;不能重叠。 一路默认 是 拉进图层可视化 线要素的话记得添加字段length&#…

OSPF和VLAN综合实验

目录 题目 1.IP地址的规划设计 2.搭建拓扑并进行基础IP配置 3.配置虚拟局域网 1&#xff09;按子网划分要求配置PC1和PC2 检测&#xff1a;输入[SW1]display vlan进行检查 配置路由器R3 检测&#xff1a;用PC1去访问PC2 2&#xff09;配置拓扑中其余路由器的网关以及回…

使用RabbitMQ

使用RabbitMQ 1 Docker安装RabbitMQ 1.1 安装RabbitMQ # 下载含有管理页面的镜像 docker pull rabbitmq:3.8.8-management# 创建容器 # 5672&#xff1a;应用访问端口&#xff1b;15672&#xff1a;控制台Web端口号&#xff1b; docker run -itd \ --namemy-rabbitmq \ --re…

OpenCV 优化和改进图像处理应用功能的方法与实践

OpenCV 优化和改进图像处理应用功能的方法与实践 导语一、性能优化二、算法改进三、用户体验改进四、应用实践示例&#xff1a;实时图像滤波总结 导语 图像处理应用是计算机视觉和图像处理领域的关键应用之一&#xff0c;通过对图像进行处理和分析&#xff0c;可以提取有用的信…

创建一门简单的解释性编程语言并实现它的解释器

背景 最近刷到大佬的教程&#xff0c;跟着学一下 效果 开始时 输入姓名和年龄后 代码 自创编程语言SimpleScript: 自创一门简易脚本支持中文编程 (gitee.com) 解析 1.词法分析 将程序的每个字符串精准划分出来&#xff0c;形成多个单词Token 2.语法分析 将各段Token再…

Android 查看ANR和Crash日志(adb bugreport)

今天测试那儿出了个ANR&#xff0c;我自己手机没问题&#xff0c;很烦&#xff0c;定位不了位置。 于是还是得用ADB连接来看一下&#xff0c;之前用&#xff0c;但是老是会忘记&#xff0c;今天总结一下。 ADB命令查看应用包名_adb查看包名命令_&岁月不待人&的博客-C…

TeeChart for.NET Crack

TeeChart for.NET Crack TeeChart for.NET为各种图表需求提供了图表控件&#xff0c;包括金融、科学和统计等重要的垂直领域。它可以处理您的数据&#xff0c;在各种平台上无缝创建信息丰富、引人入胜的图表&#xff0c;包括Windows窗体、WPF、带有HTML5/Javascript渲染的ASP.N…

【C++】string类模拟

文章目录 成员变量和查看接口迭代器&#xff08;读和读写&#xff09;operator[]&#xff08;读和读写&#xff09;c_str()size() 构造函数用字符串构造用对象构造&#xff08;两种方法&#xff09;析构 赋值运算符重载扩容和调整reserve()resize()clear() 增删查改push_back()…

产业大模型刚开卷,京东跑进“最后半公里”

点击关注 文&#xff5c;姚 悦 编&#xff5c;王一粟 “京东一直在探索哪些产品、技术、场景可以真正把大模型用起来&#xff0c;在我们内部的场景中反复验证后&#xff0c;才决定在7月份对外发布&#xff0c;现在我们在零售、健康、物流、金融等业务场景里已经积累了一些经…