SpringBoot整合RabbitMQ--Fanout模式

news/2025/3/31 18:28:19/文章来源:https://www.cnblogs.com/5ran2yl/p/18798952

使用springBoot整合rabbitMQ需要事先导入相关依赖:

         <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><dependency><groupId>org.springframework.amqp</groupId><artifactId>spring-rabbit-test</artifactId><scope>test</scope></dependency>

 

生产者项目结构

 绑定RabbitMQ的注册信息,yml文件:

#修改启动端口
server:port: 9001
#RabbitMQ 连接信息
spring:rabbitmq:username: adminpassword: adminvirtual-host: /host: 8.137.76.12port: 5672

 

Service包下的fanout业务类:

import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.UUID;@Service
public class FanoutService {//注入rabbitMQ模板
    @Autowiredprivate RabbitTemplate rabbitTemplate;//定义交换机的名字private String exchangeName = "fanout_order_exchange";//定义路由keyprivate String routingKey = "";//制造订单public void makeOrder(Long userID,Long productID,int num){String uuid = UUID.randomUUID().toString();System.out.println("用户:"+userID+",订单是:"+uuid);rabbitTemplate.convertAndSend(exchangeName,routingKey,uuid);}
}

 

config包的FanoutRabbitConfig配置类,声明队列,声明交换机,绑定关系:

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.FanoutExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class FanoutRabbitConfig {//注册rabbitMQ队列
    @Beanpublic Queue qqQueue(){//队列的名称// durable:是否持久化,默认是false,持久化队列:会被存储在磁盘上,当消息代理重启时仍然存在,暂存队列:当前连接有效// exclusive:默认也是false,只能被当前创建的连接使用,而且当连接关闭后队列即被删除。此参考优先级高于durable// autoDelete:是否自动删除,当没有生产者或者消费者使用此队列,该队列会自动删除。//   return new Queue("TestDirectQueue",true,true,false);//一般设置一下队列的持久化就好,其余两个就是默认falsereturn new Queue("qqQueue",true);}@Beanpublic Queue WeChatQueue(){//一般设置一下队列的持久化就好,其余两个就是默认falsereturn new Queue("WeChatQueue",true);}@Beanpublic Queue smsQueue(){//一般设置一下队列的持久化就好,其余两个就是默认falsereturn new Queue("smsQueue",true);}//声明交换机
    @Beanpublic FanoutExchange fanoutExchange(){return new FanoutExchange("fanout_order_exchange",true,false);}//绑定关系,将交换机和队列进行绑定
    @Beanpublic Binding bindQue1(){return BindingBuilder.bind(qqQueue()).to(fanoutExchange());}@Beanpublic Binding bindQue2(){return BindingBuilder.bind(WeChatQueue()).to(fanoutExchange());}@Beanpublic Binding bindQue3(){return BindingBuilder.bind(smsQueue()).to(fanoutExchange());}
}

 

单元测试类:

import org.cqust.rabbitmq.service.FanoutService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
class RabbitMqApplicationTests {@AutowiredFanoutService fanoutService;@Testvoid fanoutTest() throws InterruptedException {for (int i = 0; i < 5; i++) {Thread.sleep(1000);Long userId = 100L+ i;Long produceId = 10001L + i;int num = 10;fanoutService.makeOrder(userId,produceId,num);}}
}

 

消费者项目结构

依旧需要填写连接信息:

server:port: 9002spring:rabbitmq:username: adminpassword: adminvirtual-host: /host: 8.137.76.12port: 5672 

FanoutConsumer包下QQ消费者:

import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;@Component
@RabbitListener(queues = "qqQueue") // 监听名为qqQueue的队列
public class QQConsumer {@RabbitHandlerpublic void  qqMsg(String message){System.out.println("qq ----->"+message); // 打印接收到的消息
    }
}

 

 FanoutConsumer包下sms消费者:

import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;@Component
@RabbitListener(queues = "smsQueue") // 监听名为smsQueue的队列
public class smsConsumer {@RabbitHandlerpublic void  qqMsg(String message){System.out.println("sms ----->"+message); // 打印接收到的消息
    }
}

 FanoutConsumer包下wechat消费者:

import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;@Component
@RabbitListener(queues = "WeChatQueue") // 监听名为WeChatQueue的队列
public class WechatConsumer {@RabbitHandlerpublic void  qqMsg(String message){System.out.println("wechat ----->"+message); // 打印接收到的消息
    }
}

 

测试

使用生产者的单元测试,声明队列交换机,并且发送信息:

 启动消费者的springBoot容器,并且接收信息:

 

-------------

 

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

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

相关文章

查看网站支持的tls版本

f12 打开chrome 开发面板本文由 trykle 发布联系方式:QQ 294986636本文地址:https://www.cnblogs.com/trykle/p/18798939

解析PromQL并修改添加Label

最近做的项目中用到了Prometheus做预警服务,其中Prometheus使用promql语言来查询。项目中用户通过UI或者自己手动输入PromQL时候是缺少一些系统参数的,所以需要在用户输入完成以后同步到Prometheus时候将这部分缺失的信息给添加回去,这里就需要修改用户写的PromQL了。 实现思…

学习安装配置vue

1.先将nodejs下载2.在我们的安装目录下,创建名为node_cache和node_global的两个文件夹 3.打开cmd窗口,执行如下命令,将npm的全局模块目录和缓存目录配置到刚才创建的那两个目录。 npm config set prefix “D:\soft2024.7.6\nodejs\node_global” npm config set cache “D:\…

K8s Ingress, 你这个老6

Ingress 这个老6,结合nodeport和ClusterIp两种服务类型,你在引流这一块玩的花啊。 入口一夫当关,对内如鱼得水。本文是有态度马甲的第185篇原创。 本文记录了k8s中核心对象Ingress的产生背景和实现机制。 我们都知道k8s Service是一种将Pods通过网络暴露出来的抽象,每个服务…

C# .NET core 中处理图像,SkiaSharp,ImageSharp,NetVips,Magick.net多维度对比

2025年有哪些图像处理库,我们可以在项目中使用哪些库?本文列出了最流行的现有库。 .NET Core图片处理库SkiaSharp(https://github.com/mono/SkiaSharp) Magick.net(https://github.com/dlemstra/Magick.NET) ImageSharp(https://github.com/SixLabors/ImageSharp) NetV…

20243317 实验二《Python程序设计》实验报告

课程:《Python程序设计》 班级: 2433 姓名: 邓雅文 学号:20243317 实验教师:王志强老师 实验日期:2025年3月26日 必修/选修: 公选课 一、实验内容 1、掌握python中函数定义与调用相关知识点 大致框架与C语言相同,同样有实参,形参,可能有返回值,形式如下: def 函数名…

MEBCY-v2

MERCY-v2 信息收集 查找目标主机ip ┌──(root㉿kali)-[~] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:84:b2:cc, IPv4: 192.168.158.143 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.158.1 00:50:56:c…

人群密度分析预警摄像机

人群密度分析预警摄像机是可以实时地统计出一个指定区域内的总人数。当所监视区域的人员数量达到设定的阀值时摄像机输出报警信号。可设置人数阈值和时间阈值。用于设置触发进入区域内的人数值,达到该设定的阈值则摄像机输出报警信号。人数阈值可以手动设置,系统默认值为5人,…

CloudFlare DNS实现根域名跳转WWW域名,301跳转

0. 目的 托管在CloudFlare上的域名,已配置好www.bktai.com,想在用户访问根域名https://bktai.com时,重定向到 https://www.bktai.com. 为什么是重定向而不是同时可以访问?搜索引擎会搜到重复的内容,且维护两套路径都能正常工作,会造成混乱。 1. 配置根域名 点击自己要设置…

day:32 jmeter及性能测试——介绍

一、性能测试介绍 1、什么叫做性能测试? (1)通过某些工具或手段来检测软件的某些指标是否达到了要求,这就是性能测试 (2)指通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试 2、性能测试的时间? 在功能测试完成后才能进行性能测试…

第六周第五天

所用时间:405分钟 代码量(行):689 博客量(篇):20 了解到的知识点: 1.VLAN的创建与划分 今天进行了计算机网络的实验一,在昨天下载的packet tracer上进行,实现了VLAN的创建与划分,进行跨交换机的相同vlan之间的计算机和不同vlan之间的计算机的通信实验2.树状结构查询…

独立按键控制LED数码管

前言 通过1个独立按键,控制LED数码管显示字符。 结合之前我的两篇文章独立按键控制LED流水灯方向 https://www.cnblogs.com/luckydoog/p/18796974数码管静态显示 https://www.cnblogs.com/luckydoog/p/18797690效果原理 提前在程序里存储共阴极数码管的编码表,能表示的字符范…