SpringBoot使用RabbitMQ自动创建Exchange和Queue
背景
小项目,使用RabbitMQ作为消息队列,发布到不同的新环境时,由于新搭建的MQ中不存在Exchange和Queue,就会出错,还得手动去创建,比较麻烦,于是想在代码中将这些定义好后,自动控制MQ去创建。
原理与步骤
- 第一步定义RabbitAdmin Bean
- 第二步定义交换机 Bean
- 第三步定义Queue Bean
- 第四步定义Binding Bean, 这一步最关键,即将Queue与交换机
完整代码如下,定义如下代码后,即便使用新的MQ,启动项目也会自动创建,但是请注意 virtual-host 是无法被自动创建的(我目前的研究是这样,有自动创建的办法请留言告诉我,谢谢),因此如果不使用默认的virtual-host,请在MQ控制台中去创建。
package com.app.config;import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** @author Administrator* @date 2023/8/4 16:25* @description*/
@Configuration
public class RabbitConfig {@Autowiredprivate ConnectionFactory connectionFactory;@Beanpublic RabbitAdmin rabbitAdmin() {RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory);rabbitAdmin.setAutoStartup(true);return rabbitAdmin;}@Bean("addOrderExchange")public DirectExchange addOrderExchange() {return ExchangeBuilder.directExchange("addOrderExchange").durable(true).build();}@Bean("defaultExchange")public DirectExchange defaultExchange() {return ExchangeBuilder.directExchange("").durable(true).build();}@Bean("addEvtDayInvest")public Queue addEvtDayInvest() {Queue queue = QueueBuilder.durable("addEvtDayInvest").build();rabbitAdmin().declareQueue(queue);return queue;}@Bean("addEvtDayInvestBind")public Binding addEvtDayInvestBind() {return BindingBuilder.bind(addEvtDayInvest()).to(addOrderExchange()).with("");}@Bean("addMemberData")public Queue addMemberData() {Queue queue = QueueBuilder.durable("addMemberData").build();rabbitAdmin().declareQueue(queue);return queue;}@Bean("addMemberDataBind")public Binding addMemberDataBind() {return BindingBuilder.bind(addMemberData()).to(addOrderExchange()).with("");}@Bean("addRepaymentPlant")public Queue addRepaymentPlant() {Queue queue = QueueBuilder.durable("addRepaymentPlant").build();rabbitAdmin().declareQueue(queue);return queue;}@Bean("addRepaymentPlantBind")public Binding addRepaymentPlantBind() {return BindingBuilder.bind(addRepaymentPlant()).to(addOrderExchange()).with("");}@Bean("imQueue")public Queue imQueue() {Queue queue = QueueBuilder.durable("imQueue").build();rabbitAdmin().declareQueue(queue);return queue;}@Bean("imQueueBind")public Binding imQueueBind() {return BindingBuilder.bind(imQueue()).to(defaultExchange()).withQueueName();}@Bean("settleInterestQueue")public Queue settleInterestQueue() {Queue queue = QueueBuilder.durable("settleInterestQueue").build();rabbitAdmin().declareQueue(queue);return queue;}@Bean("settleInterestQueueBind")public Binding settleInterestQueueBind() {return BindingBuilder.bind(settleInterestQueue()).to(defaultExchange()).withQueueName();}@Bean("registerQueue")public Queue registerQueue() {Queue queue = QueueBuilder.durable("registerQueue").build();rabbitAdmin().declareQueue(queue);return queue;}@Bean("registerQueueBind")public Binding registerQueueBind() {return BindingBuilder.bind(registerQueue()).to(defaultExchange()).withQueueName();}@Bean("memberLoginLogQueue")public Queue memberLoginLogQueue() {Queue queue = QueueBuilder.durable("memberLoginLogQueue").build();rabbitAdmin().declareQueue(queue);return queue;}@Bean("memberLoginLogQueueBind")public Binding memberLoginLogQueueBind() {return BindingBuilder.bind(memberLoginLogQueue()).to(defaultExchange()).withQueueName();}@Bean("addParentDataQueue")public Queue addParentDataQueue() {Queue queue = QueueBuilder.durable("addParentDataQueue").build();rabbitAdmin().declareQueue(queue);return queue;}@Bean("addParentDataQueueBind")public Binding addParentDataQueueBind() {return BindingBuilder.bind(addParentDataQueue()).to(defaultExchange()).withQueueName();}@Bean("addOrderQueue")public Queue addOrderQueue() {Queue queue = QueueBuilder.durable("addOrderQueue").build();rabbitAdmin().declareQueue(queue);return queue;}@Bean("addOrderQueueBind")public Binding addOrderQueueBind() {return BindingBuilder.bind(addOrderQueue()).to(defaultExchange()).withQueueName();}@Bean("memberPerformanceQueue")public Queue memberPerformanceQueue() {Queue queue = QueueBuilder.durable("memberPerformanceQueue").build();rabbitAdmin().declareQueue(queue);return queue;}@Bean("memberPerformanceQueueBind")public Binding memberPerformanceQueueBind() {return BindingBuilder.bind(memberPerformanceQueue()).to(defaultExchange()).withQueueName();}@Bean("computeExpectedIncomeQueue")public Queue computeExpectedIncomeQueue() {Queue queue = QueueBuilder.durable("computeExpectedIncomeQueue").build();rabbitAdmin().declareQueue(queue);return queue;}@Bean("computeExpectedIncomeQueueBind")public Binding computeExpectedIncomeQueueBind() {return BindingBuilder.bind(computeExpectedIncomeQueue()).to(defaultExchange()).withQueueName();}/*** 自定义 json 格式发送消息** @return*/@Beanpublic MessageConverter messageConverter() {return new Jackson2JsonMessageConverter();}}
相关文章:
SpringBoot使用RabbitMQ自动创建Exchange和Queue
背景 小项目,使用RabbitMQ作为消息队列,发布到不同的新环境时,由于新搭建的MQ中不存在Exchange和Queue,就会出错,还得手动去创建,比较麻烦,于是想在代码中将这些定义好后,自动控制M…...
【设计模式】订单状态流传中的状态机与状态模式
文章目录 1. 前言2.状态模式2.1.订单状态流转案例2.1.1.状态枚举定义2.1.2.状态接口与实现2.1.3.状态机2.1.4.测试 2.2.退款状态的拓展2.2.1.代码拓展2.2.2.测试 2.3.小结 3.总结 1. 前言 状态模式一般是用在对象内部的状态流转场景中,用来实现状态机。 什么是状态…...
2.js中attr()用来修改或者添加属性或者属性值
attr()可以用来修改或者添加属性或者属性值 例:<input type"button" class"btn btn-info" id"subbtn" style"font-size:12px" value"我也说一句"/>1.如果想获取input中value的值 $(#subbtn).attr(value);…...
【虫洞攻击检测】使用多层神经网络的移动自组织网络中的虫洞攻击检测研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
微分流形学习之一:基本定义
微分流形学习之一:基本定义引入 引言一、微分流形的历史简介二、拓扑空间三、微分流形 引言 本文是作者在学习微分流形的时候的笔记,尽量严格完整,并带有一定理解,绝不是结论的简单罗列。如果读者知道数学分析中的 ϵ − δ \ep…...
[C++]笔记-制作自己的静态库
一.静态库的创建 在项目属性c/c里面,选用无预编译头,创建头文件与cpp文件,需要注意release模式下还是debug模式,在用库时候要与该模式相匹配,库的函数实现是外界无法看到的,最后在要使用的项目里面导入.h文件和.lib文件 二.使用一个循环给二维数组赋值 行数 : 第几个元素 / …...
优酷视频码率、爱奇艺视频码率、B站视频码率、抖音视频码率对比
优酷视频码率、爱奇艺视频码率与YouTube视频码率对比 优酷视频码率: 优酷的视频码率可以根据视频质量、分辨率和内容类型而变化。一般而言,优酷提供了不同的码率选项,包括较低的标清(SD)码率和较高的高清(…...
用pytorch实现google net
GoogleNet(也称为Inception v1)是由Google在2014年提出的一个深度卷积神经网络架构。它在ImageNet Large Scale Visual Recognition Challenge (ILSVRC) 2014比赛中取得了优秀的成绩,并引起了广泛的关注。 GoogleNet的设计目标是构建一个更…...
2023-8-15差分矩阵
题目链接:差分矩阵 #include <iostream>using namespace std;const int N 1010;int n, m, q; int a[N][N], b[N][N];void insert(int x1, int y1, int x2, int y2, int c) {b[x1][y1] c;b[x1][y2 1] - c;b[x2 1][y1] - c;b[x2 1][y2 1] c; }int main…...
物理公式分类
(99 封私信 / 81 条消息) 定义式和决定式有什么区别,怎么区分? - 知乎 (zhihu.com) 1、首先,定义一个物理符号(物理量)来表征物理世界最直观/最基本的物理现象,例如,长度(米…...
vue实现登录注册
目录 一、登录页面 二、注册页面 三、配置路由 一、登录页面 <template><div class"login_container" style"background-color: rgb(243,243,243);height: 93.68vh;background-image: url(https://ts1.cn.mm.bing.net/th/id/R-C.f878c96c4179c501a6…...
SpringBoot复习:(55)在service类中的方法上加上@Transactional注解后,Spring底层是怎么生成代理对象的?
SpringBoot run方法代码如下: 可以看到它会调用refreshContext方法来刷新Spring容器,这个refreshContext方法最终会调用AbstractApplicationContext的refresh方法,代码如下 如上图,refresh方法最终会调用finisheBeanFactoryInit…...
常用的图像校正方法
在数字图像处理中,常用的校正方法包括明场均匀性校正、查找表(LUT)校正和伽玛(Gamma)校正。这些校正方法分别针对不同的图像问题,可以改善图像质量,提升图像的可读性和可分析性。下面是这三种校…...
AWS security 培训笔记
云计算的好处 Amazon S3 (Storage) Amazon EC2 (Compute) 上图aws 的几个支柱:安全是其中一个啦 其中安全有几个方面 IAMdetection基础架构保护数据保护应急响应 关于云供应商的责任 data center 原来长这样 ,据说非常之隐蔽的 如果有天退役了…...
设计模式之代理模式(Proxy)的C++实现
1、代理模式的提出 在组件的开发过程中,有些对象由于某种原因(比如对象创建的开销很大,或者对象的一些操作需要做安全控制,或者需要进程外的访问等),会使Client使用者在操作这类对象时可能会存在问题&…...
vim 配置环境变量与 JDK 编译器异常
vim 配置环境变量 使用 vim 打开系统中的配置信息(不存在将会创建): vim ~/.bash_profile 以配置两个版本 JDK 为例(前提是已安装 JDK),使用上述命令打开配置信息: 输入法调成英文,输入 i&…...
TiDB v7.1.0 跨业务系统多租户解决方案
本文介绍了 TiDB 数据库的资源管控技术,并通过业务测试验证了效果。资源管控技术旨在解决多业务共用一个集群时的资源隔离和负载问题,通过资源组概念,可以限制不同业务的计算和 I/O 资源,实现资源隔离和优先级调度,提高…...
【题解】二叉树中和为某一值的路径(一)
二叉树中和为某一值的路径(一) 题目链接:二叉树中和为某一值的路径(一) 解题思路1:递归 我们或许想记录下每一条从根节点到叶子节点的路径,计算出该条路径的和,但此种思路用递归稍麻烦,我们可以试着把和转换为差&am…...
css中变量和使用变量和运算
变量: 语法:--css变量名:值; --view-theme: #1a99fb; css使用变量: 语法:属性名:var( --css变量名 ); color: var(--view-theme); css运算: 语法:属性名…...
数据结构之线性表的类型运用Linear Lists: 数组,栈,队列,链表
线性表 定义 一个最简单,最基本的数据结构。一个线性表由多个相同类型的元素穿在一次,并且每一个元素都一个前驱(前一个元素)和后继(后一个元素)。 线性表的类型 常见的类型:数组、栈、队列…...
Brain | 大脑的“隐秘连接”:神经可塑性的连接组储备?
摘要本文提出了一个与神经可塑性和认知储备相关的新概念:连接组储备(Connectomic reserve)。该概念旨在推动实验验证,并以胼胝体神经元及其投射在发育过程中所形成的冗余神经环路为例加以阐释。通过回顾胼胝体环路的形成机制——从皮层神经元胞体发出轴突…...
别再用Dijkstra处理负权边了!手把手教你用Bellman-Ford算法搞定带负权的最短路径问题
别再用Dijkstra处理负权边了!手把手教你用Bellman-Ford算法搞定带负权的最短路径问题 在算法竞赛和工程实践中,最短路径问题是最常见的图论挑战之一。许多开发者习惯性地使用Dijkstra算法解决所有最短路径问题,却忽视了负权边这一关键限制条件…...
EventBus @Subscribe注解全解析:除了threadMode,sticky和priority这两个属性你用对了吗?
EventBus Subscribe注解深度解析:解锁sticky与priority的高级玩法 当EventBus的Subscribe注解出现在你的Android代码中时,大多数开发者可能只关注了threadMode这个属性。但今天我们要把聚光灯转向两个常被忽视却同样强大的功能:sticky事件和p…...
Spring Boot 3.0实战:手把手教你搭建学生作业管理系统(附完整源码)
Spring Boot 3.0实战:从零构建现代化学生作业管理系统 在数字化教育快速发展的今天,传统的纸质作业管理模式已经无法满足现代教学需求。作为一名长期从事教育信息化建设的开发者,我深刻体会到一套高效、稳定的作业管理系统对提升教学效率的重…...
中文医疗对话数据集:79万条专业数据如何重塑医疗AI的未来
中文医疗对话数据集:79万条专业数据如何重塑医疗AI的未来 【免费下载链接】Chinese-medical-dialogue-data Chinese medical dialogue data 中文医疗对话数据集 项目地址: https://gitcode.com/gh_mirrors/ch/Chinese-medical-dialogue-data 在医疗人工智能技…...
nli-MiniLM2-L6-H768入门必看:无需训练、纯本地的零样本文本分类工具
nli-MiniLM2-L6-H768入门必看:无需训练、纯本地的零样本文本分类工具 1. 工具概述 nli-MiniLM2-L6-H768是一款基于cross-encoder/nli-MiniLM2-L6-H768轻量级NLI模型开发的本地零样本文本分类工具。它彻底改变了传统文本分类需要大量标注数据和训练过程的繁琐流程&…...
全志D1s/F133 RISC-V处理器架构与应用解析
1. Allwinner D1s/F133 RISC-V处理器深度解析全志科技最新推出的D1s(又称F133)处理器,作为D1 RISC-V处理器的精简版本,在保持核心功能的同时通过集成64MB DDR2内存显著降低了成本。这款处理器主要面向智能摄像头和显示屏市场&…...
斯坦福邱肖杰:预测性虚拟胚胎
摘要 整合单细胞数据、空间数据与人工智能技术的预测性虚拟胚胎系统,为跨尺度模拟哺乳动物胚胎发育提供了可行路径,有望深化人类对胚胎发育与先天性疾病的基础认知。 尽管发育生物学已取得数10年进展,构建胚胎发育的整合式、可预测模型仍是…...
告别散装工具链:用Hugging Face LeRobot一站式搞定机器人学习(附SO-101机械臂实战)
告别散装工具链:用Hugging Face LeRobot一站式搞定机器人学习(附SO-101机械臂实战) 机器人学习领域长期存在一个令人头疼的问题:工具链过于分散。想象一下,你需要同时处理HDF5格式的数据集、Gym风格的仿真环境、Stable…...
3分钟完成B站缓存转换:m4s无损转MP4的完整解决方案
3分钟完成B站缓存转换:m4s无损转MP4的完整解决方案 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾经遇到过这样的困境&…...
