Centos安装RabbitMQ,JavaSpring发送RabbitMQ延迟延时消息,JavaSpring消费RabbitMQ消息
1,版本说明
erlang 和 rabbitmq 版本说明
https://www.rabbitmq.com/which-erlang.html
确认需要安装的mq版本以及对应的erlang版本。
2,下载安装文件
RabbitMQ下载地址:
https://packagecloud.io/rabbitmq/rabbitmq-server
Erlang下载地址:
https://packagecloud.io/rabbitmq/erlang
RabbitMQ延迟消息插件下载
https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases
下载文件如图

3,安装步骤
3.1, 查询是否有安装过erlang、rabbitmq, 查询到有的话需要删除。
rpm -qa | grep rabbitmq-serverrpm -qa | grep erlang# 删除yum -y remove rabbitmq-server.noarch
3.2, 本地安装erlang
yum localinstall erlang-23.2.7-2.el7.x86_64.rpm# 查询安装的版本erl -version# Erlang (SMP,ASYNC_THREADS,HIPE) (BEAM) emulator version xxx
3.3, 本地安装rabbitmq
yum localinstall rabbitmq-server-3.9.0-1.el7.noarch.rpm
# 启动rabbitmqsystemctl start rabbitmq-server# 查看rabbitmq状态systemctl status rabbitmq-server# 设置rabbitmq服务开机自启动systemctl enable rabbitmq-server# 关闭rabbitmq服务systemctl stop rabbitmq-server# 重启rabbitmq服务systemctl restart rabbitmq-server
3.4, mq 端口开放:
firewall-cmd --zone=public --add-port=5672/tcp --permanentfirewall-cmd --zone=public --add-port=15672/tcp --permanentfirewall-cmd --reloadfirewall-cmd --zone=public --list-ports
3.5, 安装mq管理界面
# 启用管理界面插件rabbitmq-plugins enable rabbitmq_managementcurl http://localhost:15672 就可以打开web管理页面# rabbitmq有一个默认的账号密码guest,但该情况仅限于本机localhost进行访问,所以需要添加一个远程登录的用户# 添加用户rabbitmqctl add_user 用户名 密码rabbitmqctl add_user admin 123456# 设置用户角色,分配操作权限rabbitmqctl set_user_tags 用户名 角色rabbitmqctl set_user_tags admin administrator# 为用户添加资源权限(授予访问虚拟机根节点的所有权限)rabbitmqctl set_permissions -p / 用户名 ".*" ".*" ".*"rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"# 角色有四种:# administrator:可以登录控制台、查看所有信息、并对rabbitmq进行管理# monToring:监控者;登录控制台,查看所有信息# policymaker:策略制定者;登录控制台指定策略# managment:普通管理员;登录控制# 修改密码rabbitmqctl change_ password 用户名 新密码# 删除用户rabbitmqctl delete_user 用户名# 查看用户清单rabbitmqctl list_users
3.6, 延迟消息插件安装:
# 把插件包先复制到 /usr/lib/rabbitmq/lib/rabbitmq_server-3.9.0/pluginscp rabbitmq_delayed_message_exchange-3.9.0.ez /usr/lib/rabbitmq/lib/rabbitmq_server-3.9.0/plugins/rabbitmq-plugins enable rabbitmq_delayed_message_exchange#重启mq systemctl restart rabbitmq-serverrabbitmq-plugins list
3.7,登录测试
访问地址: ip:15672 账号密码: admin 123456

找到交换机 exchange,看看类型是否有延迟消息类型的

然后就可以写代码去连接发消息了。
4, Java代码
4.1, pom 引入:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency>
4.2, 配置类:
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class RabbitMQConfig {@Beanpublic RabbitAdmin rabbitAdmin(ConnectionFactory connectionFactory) {RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory);rabbitAdmin.setAutoStartup(true);return rabbitAdmin;}}
4.3, 消息定义配置类:
import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.util.HashMap;
import java.util.Map;@Configuration
public class OrderRabbitMQConfig {@Autowiredprivate RabbitAdmin rabbitAdmin;//================================订单延时=================================@BeanCustomExchange order_pay_delay_exchange() {HashMap<String, Object> args = new HashMap<>();args.put("x-delayed-type", "direct");return new CustomExchange("order_pay_delay_exchange", "x-delayed-message", true, false, args);}@Beanpublic Queue order_pay_delay_queue() {Queue queue = new Queue("order_pay_delay_queue", true, false, false);rabbitAdmin.declareQueue(queue);return queue;}@Beanpublic Binding order_pay_delay_binding() {return BindingBuilder.bind(order_pay_delay_queue()).to(order_pay_delay_exchange()).with("order_pay_delay_routing").noargs();}//================================订单支付通知======================================@Beanpublic DirectExchange order_pay_notify_exchange() {return new DirectExchange("order_pay_notify_exchange", true, false);}@Beanpublic Queue order_pay_notify_direct_queue() {Map<String, Object> argsMap = new HashMap<>();argsMap.put("x-max-priority", 5);Queue queue = new Queue("order_pay_notify_queue", true, false, false, argsMap);rabbitAdmin.declareQueue(queue);return queue;}@Beanpublic Binding ctc_bidding_auction_pay_notify_binding() {return BindingBuilder.bind(order_pay_notify_direct_queue()).to(order_pay_notify_exchange()).with("order_pay_notify_routing");}
}
4.4, 消息发送类:
import cn.hutool.json.JSONUtil;
import com.xxx.rabbitmq.dto.PayOrderNotifyDto;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.AmqpException;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessagePostProcessor;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;@Slf4j
@Component
public class RabbitMQSendUtils {private static RabbitTemplate rabbitTemplate;@Autowiredpublic RabbitMQSendUtils(RabbitTemplate rabbitTemplate) {this.rabbitTemplate = rabbitTemplate;}/*** 订单支付延时通知、发送MQ消息*/public static void sendPayDelayMessage(PayOrderNotifyDto dto, final Integer delayTimes) {//给延迟队列发送消息String msg = JSONUtil.toJsonStr(dto);log.info("订单支付延时通知、发送MQ消息: {}, delayTimes={}", msg, delayTimes);rabbitTemplate.convertAndSend("order_pay_delay_exchange", "order_pay_delay_routing", msg, new MessagePostProcessor() {@Overridepublic Message postProcessMessage(Message message) throws AmqpException {//给消息设置延迟毫秒值message.getMessageProperties().setDelay(delayTimes);return message;}});}/*** 订单支付通知,发送MQ消息*/public static void sendPayNotifyMsg(PayOrderNotifyDto dto) {log.info("订单支付通知,发送MQ消息: {}", dto);rabbitTemplate.convertAndSend("order_pay_notify_exchange", "order_pay_notify_routing", JSONUtil.toJsonStr(dto));}
}
4.5, 消息监听消费类:
import cn.hutool.json.JSONUtil;
import com.xxx.rabbitmq.dto.PayOrderNotifyDto;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;/*** MQ消费监听*/
@Slf4j
@Component
public class OrderMQListener {/*** 订单延时通知 消息*/@RabbitListener(queues = {"order_pay_delay_queue"})public void payDelayNotify(Message message) {try {String msg = new String(message.getBody());log.info("【消费】订单延时通知 MQ 消息内容: {}, Message={}", msg, message);//支付订单改成超时未支付》取消PayOrderNotifyDto dto = JSONUtil.toBean(msg, PayOrderNotifyDto.class);} catch (Exception e) {log.error("订单延时通知 消息消费失败:", e);}}/*** 订单支付通知 消息*/@RabbitListener(queues = {"order_pay_notify_queue"})public void payNotify(Message message) {try {String msg = new String(message.getBody());log.info("订单支付通知 MQ 消息内容:{}, {}", msg, message);PayOrderNotifyDto payOrderNotifyDto = JSONUtil.toBean(msg, PayOrderNotifyDto.class);} catch (Exception e) {log.error("订单支付通知 消息消费失败:", e);}}}相关文章:
Centos安装RabbitMQ,JavaSpring发送RabbitMQ延迟延时消息,JavaSpring消费RabbitMQ消息
1,版本说明 erlang 和 rabbitmq 版本说明 https://www.rabbitmq.com/which-erlang.html 确认需要安装的mq版本以及对应的erlang版本。 2,下载安装文件 RabbitMQ下载地址: https://packagecloud.io/rabbitmq/rabbitmq-server Erlang下载地…...
leetcode:1323. 6 和 9 组成的最大数字(python3解法)
难度:简单 给你一个仅由数字 6 和 9 组成的正整数 num。 你最多只能翻转一位数字,将 6 变成 9,或者把 9 变成 6 。 请返回你可以得到的最大数字。 示例 1: 输入:num 9669 输出:9969 解释: 改变…...
SpringBoot集成Redis Cluster集群(附带Linux部署Redis Cluster高可用集群)
目录 一、前言二、集成配置2.1、POM2.2、添加配置文件application.yml2.3、编写配置文件2.4、编写启动类2.5、编写测试类测试是否连接成功 一、前言 这里会使用到spring-boot-starter-data-redis包,spring boot 2的spring-boot-starter-data-redis中,默…...
LLaVA:visual instruction tuning
对近期一些MLLM(Multimodal Large Language Model)的总结 - 知乎本文将从模型结构,训练方法,训练数据,模型表现四个方面对近期的一些MLLM(Multi-modal Large Language Models)进行总结并探讨这四个方面对模型表现的影响…...
Python实现双目标定、畸变矫正、立体矫正
一,双目标定、畸变矫正、立体矫正的作用 双目目标定: 3D重建和测距:通过双目目标定,您可以确定两个摄像头之间的相对位置和朝向,从而能够根据视差信息计算物体的深度,进行三维重建和测距。姿态估计…...
showdoc 文件上传 (cnvd-2020-26585)
showdoc 文件上传 (cnvd-2020-26585) 描述 ShowDoc是一个非常适合IT团队的在线API文档、技术文档工具。通过showdoc,你可以方便地使用markdown语法来书写出美观的API文档、数据字典文档、技术文档、在线excel文档等等。 api_page存在任意文…...
Java数据类型,变量与运算符
1.字面常量 常量是在程序运行期间,固定不变的量称为常量。 public class HelloWorld{public static void main(String[] args){System.out.println("Hello,world");} } 在以上程序中,输出的Hello Word,其中的“Hello Word”就是…...
Linux nm命令
Linux的nm命令主要用于列出对象文件中的符号。以下是一些使用示例: 基本用法:只需运行’nm’命令,并将对象文件的名称作为输入传递给它。例如,我使用’nm’命令与’apl’elf 文件:nm apl。 在输出中为每个符号前面添加…...
iOS发布证书.p12文件无密码解决办法及导出带密码的新.p12文件方法
摘要: 本文将以iOS技术博主身份,分享解决使用无密码的.p12文件发布应用时遇到的问题,并介绍如何以带密码的方式重新导出.p12文件的方法。通过本文提供的步骤,开发者可以顺利完成证书的发布流程。 引言 在iOS应用发布过程中&…...
OpenCamera拍照的代码流程
按理来说,拍照应该是很简单的。随着功能的复杂,代码也是越来越多,流程越来越长。想看看地理位置是怎么保存的,于是就研究了一下OpenCamera的拍照流程。在回调时有点乱。 MainActivity clickedTakePhoto() takePicture() takePic…...
华为OD机考算法题:矩阵最大值
题目部分 题目矩阵最大值难度难题目说明给定一个仅包含 0 和 1 的 N*N 二维矩阵,请计算二维矩阵的最大值,计算规则如下: 1. 每行元素按下标顺序组成一个二进制数(下标越大越排在低位),二进制数的值就是该行…...
【Javascript】函数之形参与实参
function c(a,b){return ab;}var sumc(3,4);console.log(sum);a,b为形参 3,4为实参 形参和实参是⼀⼀对应的数量可以不对应参数的类型不确定函数可以设置默认参数实参可以是字⾯量也可以是变量...
PAT 乙级1090危险品装箱
题目: 集装箱运输货物时,我们必须特别小心,不能把不相容的货物装在一只箱子里。比如氧化剂绝对不能跟易燃液体同箱,否则很容易造成爆炸。 本题给定一张不相容物品的清单,需要你检查每一张集装箱货品清单,…...
Response Header中不暴露Server(IIS)版本、ASP.NET及相关版本等信息
ASP MVC开发的Web默认情况下会在请求的回应中暴露Server、X-AspNet-Version、X-AspNetMvc-Version、X-Powered-By等相关服务端信息,公开这些敏感信息会存在一定的安全风险。 X-SourceFiles标头用于被IIS / IIS Express中某些调试模块理解,它包含到磁盘上…...
测试C#调用Vlc.DotNet组件播放视频
除了Windows Media Player组件,在百度上搜索到还有不少文章介绍采用Vlc.DotNet组件播放视频,关于Vlc.DotNet的详细介绍见参考文献1,本文学习Vlc.DotNet的基本用法。 VS2022中新建基于.net core的winform程序,在Nuget包管理器中…...
JS的事件委托(Event Delegation)
✨ 事件委托(Event Delegation)及其优势和缺点 🎃 什么是事件委托 事件委托是一种在JavaScript中处理事件的技术。它利用了事件的冒泡机制,将事件处理程序绑定到它们的共同祖先元素上,而不是直接绑定到每个子元素上。…...
selenium+python自动化安装驱动 碰到的问题
刚开始使用谷歌驱动,我的谷歌浏览器版本是最新版下载驱动地址,访问不了。 Chrome for Testing availability只能使用火狐驱动,我这里的火狐版本也是最新版119.0 查找全网找到驱动geckodriver下载地址 https://mirrors.huaweicloud.com/ge…...
laravel+vue2 element 一套项目级医院手术麻醉信息系统源码
手术麻醉临床信息系统源码,PHPmysqllaravelvue2 手术麻醉临床信息系统,采用计算机和通信技术,实现监护仪、麻醉机、输液泵等设备输出数据的自动采集,采集的数据能够如实准确地反映患者生命体征参数的变化,并实现信息高…...
GEE——使用MODIS GPP和LAI数据进行一元线性回归计算和R2分析
使用两种方法计算一元线性回归,一种使用GEE本身自带的函数,另一种使用自己编写代码的方式进行,对比两者结果的差异。 简介 一元线性趋势分析是指利用一元线性回归模型来分析一组数据的趋势性。在一元线性回归模型中,我们假设自变量(x)和因变量(y)之间存在一定的线性关…...
[论文阅读]Point Density-Aware Voxels for LiDAR 3D Object Detection(PDV)
PDV Point Density-Aware Voxels for LiDAR 3D Object Detection 论文网址:PDV 论文代码:PDV 简读论文 摘要 LiDAR 已成为自动驾驶中主要的 3D 目标检测传感器之一。然而,激光雷达的发散点模式随着距离的增加而导致采样点云不均匀&#x…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...
Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案
在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…...
