在SpringBoot中对RabbitMQ三种使用方式

news/2024/11/29 6:49:27/

基于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.ppmy.cn/news/786679.html

相关文章

易微联2.4G通断器添加到手机步骤

蓝牙款无WIFI,按住通断器上的按钮,会先闪一下,再闪两下。闪一下的时候连手机,闪两下清码。 手机上打开易微联app,依次点击加号/轻智能遥控器/单按键遥控器/添加完成。 返回打开刚才添加的开关,在通断器闪…

关于GMS3(Digitalmicrograph)μm微米显示乱码的处理方法

由于该软件对中文编码系统支持不太好,我平时都放的um,答辩时被评委老师提出来说了“该μm就写μm”。定稿前修改论文的时候就在想这个事儿,结果方法被我试出来了。 方法如下: 1、先按照网上教程对SEM/TEM图片进行尺码测量&#…

python函数长度单位换算_长度单位换算表-在线长度单位转换器

长度单位换算表-在线长度单位转换器 公里(kilometre) 米(metre) 分米(decimeter) 厘米(centimeter) 毫米(millimeter) 微米(micrometer) 里 丈 尺 寸 分 厘 海里(nautical mile) 英寻 英里(mile) 弗隆(fur) 码(yard) 英尺(foot) 英寸(inch) 长度单位介绍 长度单位是测量长度或距…

matlab(4):特殊符号的输入

xlabel(\delta); ylabel(AUC); 具体符号的对照表参照下图:

在pcb放置坐标标注_PCB设计定位基准符号和尺寸

基准标志(FiducialMarks)和局部基准标志是贴片设备用来进行光学定位的特殊PAD。 基准应用 基准符号的应用有三种情况,1)用于PCB的整板定位;2)用于拼版的PCB子板的定位。3)用于细间距器件的定位,对于这种情况原则上间距小于0.5mm的…

移动机器人传感器---IMU

文章目录 1. IMU概念2. IMU模块概述2.1 MEMS传感器2.2 三轴陀螺仪 3. IMU输出数据在移动机器人算法中的应用 1. IMU概念 惯性测量模块(IMU,Inertial Measurement Unit)组成。IMU提供飞行器在空间姿态的传感器原始数据,一般由陀螺…

挠场的科学丨三、特斯拉所来不及知道的「挠场」

摘自李嗣涔教授《挠场的科学》 挠场所产生之力,比万有引力还弱,却是神奇的力量。 它原属广义相对论的一部分, 但当年被爱因斯坦忽略, 直到一九二○年代被法国物理学家卡坦所加入, 补充成更完整的相对论。 一九六○…

角度单位中角分、角秒的进制转换

度 (degrees, deg)角分(minute of arc,arc minutes, arc min),又称弧分,记作角秒(Arcsecond),又称弧秒,记作"毫角秒(milliarcseconds,缩写ma…