14. Springboot集成RabbitMQ

目录

1、前言

2、什么是RabbitMQ

3、安装RabbitMQ

4、Springboot集成RabbitMQ

4.1、添加依赖

4.2、添加配置

4.3、添加controller,作为生产者

4.4、设置生产者消息确认CallBack

4.5、添加Consumer,作为消费者

4.6、启动程序,访问


1、前言

消息队列(Message Queue,简称 MQ)是一种异步的消息传递中间件,它解耦了应用程序之间的通信。应用程序可以将消息发送到队列,而无需知道谁会接收这些消息。接收应用程序可以从队列中检索消息,而无需知道谁发送了这些消息。消息队列是一种重要的中间件,它可以帮助应用程序之间进行异步、可靠、可扩展的通信。常见的消息队列中间件有ActiveMQ,RabbitMQ,Kafka......今天我们就来介绍RabbitMQ。

2、什么是RabbitMQ

RabbitMQ 是一个开源的消息队列服务器,它实现了 AMQP (高级消息队列协议) 标准。AMQP 是一种应用层协议,为面向消息的中间件设计,基于此协议的客户端与消息中间件可传递消息,并不受产品、开发语言等条件的限制。

AMQP :Advanced Message Queue,高级消息队列协议。它是应用层协议的一个开放标准,为面向消息的中间件设计,基于此协议的客户端与消息中间件可传递消息,并不受产品、开发语言等条件的限制。

RabbitMQ 的主要特点包括:

  • 高性能:RabbitMQ 能够处理大量的消息,并提供低延迟的性能。
  • 可靠性:RabbitMQ 提供持久化消息存储,确保消息不会丢失。
  • 可扩展性:RabbitMQ 可以轻松扩展以满足不断增长的需求。
  • 灵活性:RabbitMQ 支持多种编程语言和客户端,并提供丰富的功能和配置选项。

RabbitMQ 的常见应用场景包括:

  • 分布式系统:RabbitMQ 可以用于在分布式系统中进行异步通信。
  • 异步处理:RabbitMQ 可以用于异步处理任务,提高系统的性能和效率。
  • 消息队列:RabbitMQ 可以用于实现消息队列,例如任务队列、发布/订阅队列等。
  • 消息通知:RabbitMQ 可以用于发送消息通知,例如电子邮件或短信。

3、安装RabbitMQ

由于RabbitMQ是一个由 Erlang 语言开发的 AMQP 的开源实现。所以在安装RabbitMQ前需要先安装Erlang环境。

Erlang下载地址:Downloads - Erlang/OTP

RabbitMQ下载地址:Installing RabbitMQ | RabbitMQ

先安装Erlang,在安装RabbitMQ。安装工程相对简单,无脑下一步即可。

安装完RabbitMQ后,打开cmd窗口,进入RabbitMQ的安装目录的sbin下,我的目录是:

D:\RabbitMQ Server\rabbitmq_server-3.13.0\sbin

然后输入以下命令安装一下插件:

rabbitmq-plugins enable rabbitmq_management

提示以下这个就是安装成功。

验证RabbitMQ是否安装成功,输入以下命令:

rabbitmqctl status

这时候,直接访问http://127.0.0.1:15672就可以看到RabbitMQ的管理页面了,RabbitMQ默认端口为15672,默认的管理页面账号密码均为guest。

登录后,就可以看到一个初始的管理界面:

4、Springboot集成RabbitMQ

4.1、添加依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.3</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>springboot-rabbitmq</artifactId><version>0.0.1-SNAPSHOT</version><name>springboot-rabbitmq</name><description>springboot-rabbitmq</description><properties><java.version>17</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.24</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>

4.2、添加配置

# rabbitmq连接配置信息
spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest# 确保消息在未被队列接收时返回
spring.rabbitmq.publisher-returns=true
# 发布消息成功到交换器后会触发回调方法
spring.rabbitmq.publisher-confirm-type=correlated

4.3、添加controller,作为生产者

新建controller,用于发送消息。

package com.example.springbootrabbitmq.controller;import com.example.springbootrabbitmq.config.MqProducerCallBack;
import jakarta.annotation.Resource;
import org.springframework.amqp.core.MessageDeliveryMode;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("push/message")
public class PushMessageController {@Resourceprivate RabbitTemplate rabbitTemplate;@Resourceprivate MqProducerCallBack mqProducerCallBack;@GetMapping("test")public String sendMessage() {// correlationData:对象内部只有一个 id 属性,用来表示当前消息的唯一性。CorrelationData correlationData = new CorrelationData("id_" + System.currentTimeMillis());// 消息确认和返回回调rabbitTemplate.setConfirmCallback(mqProducerCallBack);rabbitTemplate.setReturnsCallback(mqProducerCallBack);// 消息发送rabbitTemplate.convertAndSend("my-queue", "hello world", message -> {message.getMessageProperties().setDeliveryMode(MessageDeliveryMode.PERSISTENT);return message;}, correlationData);return "publisher success...";}
}

4.4、设置生产者消息确认CallBack

package com.example.springbootrabbitmq.config;import cn.hutool.json.JSONUtil;
import org.springframework.amqp.core.ReturnedMessage;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Component;@Component
public class MqProducerCallBack implements RabbitTemplate.ConfirmCallback, RabbitTemplate.ReturnsCallback {/*** correlationData:对象内部只有一个 id 属性,用来表示当前消息的唯一性。* ack:消息投递到broker 的状态,true成功,false失败。* cause:投递失败的原因。*/@Overridepublic void confirm(CorrelationData correlationData, boolean ack, String cause) {if (!ack) {System.err.println("消息ID=" + correlationData.getId() + "投递失败,失败原因:" + cause);} else {System.out.println("消息投递收到确认,correlationData=" + correlationData.getId());}}@Overridepublic void returnedMessage(ReturnedMessage returnedMessage) {System.out.println("返回消息结果:" + JSONUtil.toJsonStr(returnedMessage));}}

4.5、添加Consumer,作为消费者

package com.example.springbootrabbitmq.consumer;import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;import java.io.IOException;@Component
public class PushMessageConsumer {/*** basicAck:表示成功确认,使用此回执方法后,消息会被rabbitmq broker 删除。* void basicAck(long deliveryTag, boolean multiple)* deliveryTag:表示消息投递序号,每次消费消息或者消息重新投递后,deliveryTag都会增加。手动消息确认模式下,我们可以对指定deliveryTag的消息进行ack、nack、reject等操作。* multiple:是否批量确认,值为 true 则会一次性 ack所有小于当前消息 deliveryTag 的消息。* */@RabbitListener(queuesToDeclare = @Queue(value = "my-queue"))@RabbitHandlerpublic void consume(String msg, Channel channel, Message message) throws IOException {try {System.out.println("消费者收到消息:" + msg);channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);System.out.println("deliveryTag:" + message.getMessageProperties().getDeliveryTag());System.out.println("redelivered:" + message.getMessageProperties().getRedelivered());} catch (Exception e) {if (message.getMessageProperties().getRedelivered()) {System.err.println("消息已重复处理失败,拒绝再次接收!");/*** 拒绝消息,requeue=false 表示不再重新入队,如果配置了死信队列则进入死信队列* basicReject:拒绝消息,与basicNack区别在于不能进行批量操作,其他用法很相似。* deliveryTag:表示消息投递序号。* requeue:值为 true 消息将重新入队列。*/channel.basicReject(message.getMessageProperties().getDeliveryTag(), false);} else {System.out.println("消息即将再次返回队列处理!");/*** requeue为是否重新回到队列,true重新入队* deliveryTag:表示消息投递序号。* multiple:是否批量确认。* requeue:值为 true 消息将重新入队列。*/channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);}}}}

4.6、启动程序,访问

浏览器访问:http://localhost:8080/push/message/test 模拟消息进行推送。

查看控制台,发现消费者正常打印出了消费信息。

打开RabbitMQ管理控制台,可以发现我们的消息队列my-queue信息。

既可以查看消息队列的装填,消息投递情况等。

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

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

相关文章

关键字:this总结

this关键字的使用1. 目前可能出现的问题&#xff1f;及解决方案&#xff1f;我们在声明一个属性对应的setXxx方法时&#xff0c;通过形参给对应的属性赋值。如果形参名和属性名同名了&#xff0c;那么该如何在方法内区分这两个变量呢&#xff1f;解决方案&#xff1a;使用this。…

YOLOv9改进策略 :block优化 | 无需TokenMixer也能达成SOTA性能的极简ViT架构 | CVPR2023 RIFormer

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文改进内容&#xff1a; token mixer被验证能够大幅度提升性能&#xff0c;但典型的token mixer为自注意力机制&#xff0c;推理耗时长&#xff0c;计算代价大&#xff0c;而RIFormers是无需TokenMixer也能达成SOTA性能的极简ViT架构…

java寻找递增子序列(力扣Leetcode491)

寻找递增子序列 力扣原题链接 问题描述 给定一个整数数组 nums&#xff0c;找出并返回所有该数组中不同的递增子序列&#xff0c;递增子序列中至少有两个元素。你可以按任意顺序返回答案。数组中可能含有重复元素&#xff0c;如出现两个整数相等&#xff0c;也可以视作递增序…

Raspberry Pi Pico 可以充当 GPU 吗?

来自 element14 的克莱姆的任务是探索将 Raspberry Pi Pico 转化为 GPU 的可能性&#xff0c;以便在游戏中渲染超级流畅的图形。是的&#xff0c;你没有看错&#xff01;他不是在尝试使用我们的怪物级新 Raspberry Pi 5&#xff0c;甚至不是 Pi 4&#xff0c;他是在尝试使用我们…

数据结构:归并排序

归并排序 时间复杂度O(N*logN) 如果两个序列有序,通过归并,可以让两个序列合并后也有序,变成一个有序的新数组 对于一个数组,如果他的左右区间都有序,就可以进行归并了 归并的方法 将数组的左右两个有序区间比较,每次都取出一个最小的,然后放入临时数组(不能在原数组上修改…

PermissionError: [WinError 5] 拒绝访问。: ‘..\\data‘ 怎么解决

问题 在b站跟着沐神学深度学习&#xff0c;刚开始就遇到问题了&#xff0c;代码如下&#xff1a; import osos.makedirs(os.path.join(..,data),exist_okTrue) data_fileos.path.join(..,data,house_tiny.csv) with open(data_file,w) as f:f.write(NumRooms,Alley,Price\n)f…

空间数据结构(四叉树,八叉树,BVH树,BSP树,K-d树)

下文参考&#xff1a;https://www.cnblogs.com/KillerAery/p/10878367.html 游戏编程知识课程 - 四分树(quadtree)_哔哩哔哩_bilibili 利用空间数据结构可以加速计算&#xff0c;是重要的优化思想。空间数据结构常用于场景管理&#xff0c;渲染&#xff0c;物理&#xff0c;…

【过度拟合?秒了!】

目录 引言 一、简化模型复杂度 1 .1 特征选择 1.2 降低多项式阶数 1.3 减少神经元数量或层数 二、使用正则化技术 2.1 L1正则化&#xff08;Lasso&#xff09; 工作原理 应用场景 2.2 L2正则化&#xff08;Ridge&#xff09; 2.3 Elastic Net正则化 2.4 代码事例 …

国内如何购买midjourney?midjourney购买教程?midjourney注册方式?

1. Midjourney介绍 Midjourney 是一款备受欢迎的人工智能生成图像工具&#xff0c;它可以通过输入文字描述&#xff0c;自动生成精美的图像。与许多其他图像生成工具不同&#xff0c;Midjourney 不需要安装任何软件&#xff0c;也不受个人电脑性能的限制&#xff0c;因为它运行…

【测试篇】测试眼里的 BUG

文章目录 如何描述一个bug如何定义 bug 的级别BUG 的生命周期跟开发起争执怎么办&#xff08;高频面试题&#xff09; 如何描述一个bug 一个合格的bug描述应该包含以下几个部分&#xff1a; 发现问题的版本问题出现的环境错误重现的步骤预期行为的描述错误行为的描述其他&…

USB-PD

这是目录 写在前面1、概览2、信息2.1 消息结构2.1.1 消息头 3、soft or hard reset1、soft reset2、hard reset 3、TYPE-C相关握手3.1、CC线的状态3.1.1、默认电源值3.2 TYPE-C设备握手协商过程确定握手类型DRP和DRP设备握手 写在前面 1、记录自己的学习PD协议层的文章 1、概…

消息队列经典应用场景

笔者心中,消息队列,缓存,分库分表是高并发解决方案三剑客。 在职业生涯中,笔者曾经使用过 ActiveMQ 、RabbitMQ 、Kafka 、RocketMQ 这些知名的消息队列 。 这篇文章,笔者结合自己的真实经历,和大家分享消息队列的七种经典应用场景。 1 异步&解耦 笔者曾经负责某电…

00、SpringBatch 4.x.x版本:简单入门

00、SpringBatch批处理 一、介绍1、什么是批处理&#xff1f;2、官网3、优势4、组织架构5、程序运行架构图 二、入门案例-H2版(内存)1、新建项目2、引入依赖3、新建HelloJob.java 三、入门案例-MySQL版1、引入依赖2、修改 application.yml3、验证 四、案例解析1、EnableBatchPr…

国产桌面操作系统统一身份认证及2FA双因子认证安全升级方案

某金融运营服务公司&#xff0c;主要负责业务处理、客户服务、业务监控、报表统计等金融运营服务&#xff0c;为集团下设二级单位&#xff0c;坐落于一线城市&#xff0c;对政策风向有很高的敏锐度。 该公司已为公司业务人员、客户服务、监督员等配备了数百台国产桌面操作系统…

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之七 简单图像浮雕效果

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之七 简单图像浮雕效果 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之七 简单图像浮雕效果 一、简单介绍 二、简单图像浮雕效果实现原理 三、简单图像浮雕效果案例实现简单步骤 四、注…

网络七层模型之会话层:理解网络通信的架构(五)

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

【豫都故郡·领航新篇】Springer独立出版 |第二届先进无人飞行系统国际会议(ICAUAS 2024)

会议简介 Brief Introduction 2024年第二届先进无人飞行系统国际会议(ICAUAS 2024) 会议时间&#xff1a;2024年6月14日-16日 召开地点&#xff1a;中国南昌 大会官网&#xff1a;ICAUAS 2024-2024 2nd International Conference on Advanced Unmanned Aerial Systems2024 2nd …

【C++】力扣-415-字符串相加(双指针,图例详解!!!)

目录 一、前言 二、字符串相加 三、共勉 一、前言 最近春招已经开始&#xff0c;看周围的同学都在投递一些大厂的实习&#xff0c;某为的手撕代码 --- 字符串相乘&#xff0c;某讯的手撕代码 --- 字符串相减等。 于是专门去 Leetcode 上搜索了一下&#xff0c;发现这类题目是面…

conda使用记录

linux 使用conda创建新一个新的python环境过程 conda create -n recommendation_env python3.8.18 # 指定python版本 conda env list # 查看所有的环境 conda activate recommendation_env # 激活创建的新环境 pip install flask # 安装依赖 或者 pip install flask版本号 或者…

脑机交互,屏幕是必须?No!让机器人发出激光光点实现脑机接口交互

一般说来&#xff0c;传统脑机接口(BCI)系统的交互过程依靠一个图形化的用户界面&#xff0c;不利于设备的便携性。而一种无屏幕的BCI可以通过让机器人在外界环境中发出刺激从而实现更直接的命令其中机器人使用激光光点凸显环境中的候选对象&#xff0c;而用户的目标则从脑电图…