Springboot集成Rabbitmq

Springboot集成Rabbitmq实现请求异步处理

一、Docker部署rabbitmq

1. docker pull rabbitmq:3.7.8

rabbitmq为需要拉取的镜像名称,3.7.8为版本号

2. docker run -d -p 5672:5672 -p 15672:15672 --name rabbitmq rabbitmq:3.7.8

运行拉取到的镜像文件;-d表示后台运行镜像;-p指将容器的端口映射到主机中;–name为设置容器的名称

3. docker ps -a

查看镜像是否运行成功

4. docker exec -it rabbitmq rabbitmq-plugins enable rabbitmq_management

启动rabbitmq_management,可以在浏览器访问web页面,默认账号密码为guest/guest

5. docker exec -it rabbitmq rabbitmqctl add_user admin xxx

docker exec -it rabbitmq rabbitmqctl set_user_tags admin administrator

为rabbitmq创建用户并设置权限,admin为用户名,xxx为密码

二、Springboot集成rabbitmq

1.maven依赖添加
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
2.application.properties配置
#rabbitmq
#常规配置
spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=433430
#特定需求配置
spring.rabbitmq.publisher-confirm-type=correlated
spring.rabbitmq.publisher-returns=true
spring.rabbitmq.template.mandatory=true
3.rabbitmq配置文件类
@Configuration
public class RabbitConfig {@Beanpublic RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);rabbitTemplate.setMandatory(true);//设置rabbitTemplate确认机制rabbitTemplate.setConfirmCallback(new RabbitConfirm());rabbitTemplate.setReturnCallback(new RabbitReturn());return rabbitTemplate;}
}
4.生产者发送数据
@RestController
public class SendMessageController {@AutowiredRabbitTemplate rabbitTemplate;@GetMapping("/send")public String sendDirectMessage(){String messageId = String.valueOf(UUID.randomUUID());String messageData = "test message, hello!";String createTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));Map<String,Object> map=new HashMap<>();map.put("messageId",messageId);map.put("messageData",messageData);map.put("createTime",createTime);//将消息携带绑定键值:TestDirectRouting 发送到交换机TestDirectExchangerabbitTemplate.convertAndSend("test", "a", map);return "ok";}
}
4.消费者消费数据
@Component
@RabbitListener(queues = "test-que")    //配置需要监听的队列名
public class DirectReceiver {@RabbitHandlerpublic void process(Map test) throws InterruptedException {System.out.println("DirectReceiver消费者收到消息  : " + test.toString());}
}
5.ConfirmCallback确认机制配置(确认消息是否发送到交换机上)

在application.properties中配置:spring.rabbitmq.publisher-confirm-type=correlated

publisher-confirm-type 新版发布确认属性有三种确认类型:

  1. NONE值是禁用发布确认模式,是默认值
  2. CORRELATED值是发布消息成功到交换器后会触发回调方法,如1示例
  3. SIMPLE值经测试有两种效果,其一效果和CORRELATED值一样会触发回调方法,其二在发布消息成功后使用rabbitTemplate调用waitForConfirms或waitForConfirmsOrDie方法等待broker节点返回发送结果,根据返回结果来判定下一步的逻辑,要注意的点是waitForConfirmsOrDie方法如果返回false则会关闭channel,则接下来无法发送消息到broker;
public class RabbitConfirm implements RabbitTemplate.ConfirmCallback {@Overridepublic void confirm(CorrelationData correlationData, boolean ack, String cause) {if (b){System.out.println("接收到了来自生产者的消息!");}else {System.out.println("未接收到");}//可自行定义业务逻辑}
}
6.ReturnCallback确认机制配置(未投递到队列上的数据将退回)

在application.properties中配置:

spring.rabbitmq.publisher-returns=true

spring.rabbitmq.template.mandatory=true(将 mandatory设置为true,如果消息不可路由那么rabbitmq会把完整的消息退回到发布者中)

public class RabbitReturn implements RabbitTemplate.ReturnCallback {@Overridepublic void returnedMessage(Message message, int i, String s, String s1, String s2) {System.out.println("消息主体:"+message.toString());System.out.println("回复编码:"+i);System.out.println("回复内容:"+s);System.out.println("交换器:"+s1);System.out.println("路由键:"+s2);//可自行定义业务逻辑}
}
7.发送自定义对象(两种方法)

rabbitTemplate源码默认采用SimpleMessageConverter来序列化消息的,只接受byte数组,string字符串,可序列化对象,如果传入费序列化的对象,会报错:java.lang.IllegalArgumentException: SimpleMessageConverter only supports String, byte[] and Serializable payloads, received: com.rabbitmq.producer.model.xxx

(1).自定义MessageConverter
public static class SelfConverter extends AbstractMessageConverter {@Overrideprotected Message createMessage(Object object, MessageProperties messageProperties) {messageProperties.setContentType("application/json");return new Message(JSON.toJSONBytes(object), messageProperties);}@Overridepublic Object fromMessage(Message message) throws MessageConversionException {return JSON.parse(message.getBody());}
}

然后在rabbitmq的配置类代码中添加

rabbitTemplate.setMessageConverter(new SelfConverter());
(2).Jackson2JsonMessageConverter

直接在rabbitmq的配置类代码中添加

rabbitTemplate.setMessageConverter(new Jackson2JsonMessageConverter());
8.设置消费者应答机制
//在rabbit配置文件类中添加如下代码
@Beanpublic SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory(ConnectionFactory connectionFactory) {SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();factory.setConnectionFactory(connectionFactory);//设置手动ack模式 要和yml配置保持一致,不然会覆盖yml文件的配置factory.setAcknowledgeMode(AcknowledgeMode.MANUAL);return factory;}
//消费者消费数据
@Component
public class DirectReceiver {@RabbitListener(queues = "test-que")@RabbitHandlerpublic void process(String test, Channel channel, Message message) throws IOException {long deliveryTag = message.getMessageProperties().getDeliveryTag();System.out.println("DirectReceiver消费者收到消息  : " + test.toString());channel.basicAck(deliveryTag,false);System.out.println("消息回退");}
}//应答机制共有三种:
/**
首先需要在SimpleRabbitListenerContainerFactory中配置 “factory.setAcknowledgeMode(AcknowledgeMode.MANUAL);”
AcknowledgeMode共有三种:
1.NONE:默认情况下消息消费者是NONE模式,默认所有消息消费成功,会不断的向消费者推送消息。因为rabbitMq认为所有消息都被消费成功,所以队列中不在存有消息,消息存在丢失的危险
2.AUTO(自动确认):在自动确认模式下,消息发送后即被认为成功投递,不管消费者端是否成功处理本次投递
3.MANUAL(手动确认):消费者收到消息后,手动调用basic.ack/basic.nack/basic.reject后,RabbitMQ收到这些消息后,才认为本次投递成功(1)basicAck(long deliveryTag, boolean multiple):表示成功确认,使用此回执方法后,消息会被rabbitmq broker删除。deliveryTag:消息投递序号。multiple:是否批量确认,true->将一次性拒绝所有小于deliveryTag的消息。(2)basicNack(long deliveryTag, boolean multiple, boolean requeue):表示失败确认,一般在消费消息异常时用到此方法,可以将消息重新投递入队列。deliveryTag:表示消息投递序号。multiple:是否批量;true->将一次性拒绝所有小于deliveryTag的消息。requeue: 表示消息是否重新入队列,true表示重新投入队列中。(3)basicReject(long deliveryTag, boolean requeue):拒绝消息,与basicNack区别在于不能进行批量操作,其他用法很相似。deliveryTag:消息投递序号。requeue:值为true表示消息重新入队列。
**/

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

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

相关文章

本人用编译

板子方 修改ip&#xff08;保证板子和主机在同一个网段&#xff09; mount -t nfs -o rw,nolock,nfsvers3 192.168.1.200:/home/violet/nfs get/ 互通的文件在~目录下get文件内 电脑方 使用arm-linux-gnueabihf-gcc 编译

外部提供控制程序

外部提供控制程序 文件编号&#xff1a;XXX 1、目的和适用范围 规范在研发与生产过程中所涉及到的采购、外包行为方式&#xff0c;对外部提供过程和产品进行控制&#xff0c;评估、选择及控制外部提供方&#xff0c;并对采购活动及外包过程进行有效地控制&#xff0c;确保外部…

性能优化(CPU优化技术)ARM Neon 详解

原文来自ARM neon详解 &#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;高性能&#xff08;HPC&#xff09;开发基础教程 &#x1f380;CSDN主页 发狂的小花 &#x1f304;人生秘诀&#xff1a;学习的本质就是极致重…

AI新工具(20240322) 免费试用Gemini Pro 1.5;先进的AI软件工程师Devika;人形机器人Apptronik给你打果汁

✨ 1: Gemini Pro 1.5 免费试用Gemini Pro 1.5 Gemini 1.5 Pro是Gemini系列模型的最新版本&#xff0c;是一种计算高效的多模态混合专家&#xff08;MoE&#xff09;模型。它能够从数百万个上下文Token中提取和推理细粒度信息&#xff0c;包括多个长文档和数小时的视频、音频…

ASP.NET控件

目录 TextBox 控件 Button 控件 HyperLink 控件 CheckBox 控件 RadioButton 控件 ListBox 控件 DropDownList 控件 Repeater 控件 DataList 控件 GridView 控件 RequiredFieldValidator 控件 RangeValidator 控件 CompareValidator 控件 RegularExpressionValidat…

C++读取文本文件中的汉字出现乱码的原因及解决措施

大家好&#xff01; 作者今天在写代码时遇到了读取文本文件中的汉字时出现乱码的情况&#xff0c;所以本文介绍Windows操作系统中&#xff0c;C读取文本文件中的汉字出现乱码情况原因及解决措施。 下面代码可以读取Stu.txt中的内容并输出&#xff1a; ifstream ifs; ifs.open(…

拌合楼管理软件开发(十一) 海康威视车牌识别摄像头安装调试,记录犯经验主义错误不断自己打脸过程

前言: 从小白开始 海康威视的摄像头接触过,包括前面也都开发了调用sdk开发拍照和视频预览,以及通过事件警报获取数据的。接触到的像头都是12v或者24v电源&#xff0c;或者是POE供电的&#xff0c;先入为主了觉得都是这样&#xff0c;结果打脸了。 一、设备选型&#xff1a; 最开…

MySQL 经典练习 50 题 (记录)

前言&#xff1a; 记录一下sql学习&#xff0c;仅供参考基本都对了&#xff0c;不排除有些我做的太快做错了。里面sql不存在任何sql优化操作&#xff0c;只以完成最后输出结果为目的&#xff0c;包含我做题过程和思路最后一行才是结果。 1.过程: 1.1.插入数据 /* SQLyog Ul…

【机器学习入门 】人工神经网络(一)

系列文章目录 第1章 专家系统 第2章 决策树 第3章 神经元和感知机 识别手写数字——感知机 第4章 线性回归 第5章 逻辑斯蒂回归和分类 第5章 支持向量机 文章目录 系列文章目录前言一、多层感知机二、反向传播算法三、深度神经网络 前言 人工神经网络( Artifical Neural Netw…

蓝桥杯-02-2023蓝桥杯c/c++省赛B组题目

参考 2023 年第十四届蓝桥杯 C/C B组省赛题解 2023蓝桥杯c/c省赛B组题目(最全版)&#xff1a; A&#xff1a;日期统计 这题方法应该很多&#xff0c;没有和别人讨论想法。我的解法思路是&#xff1a;先 load 函数生成所有这一年的合法日期&#xff0c;然后枚举所有可以从数据…

node和npm yarn包管理工具

node和包管理工具 今日目标&#xff1a; 1.dos常用指令 2.node的模块化 3.npm包管理工具 4.yarn的常用指令 5.node的内置模块 00-回顾 # Promose:作用&#xff1a;解决ajax请求响应顺序不可控的问题特性&#xff1a;1. Promise是一个构造函数&#xff0c;需要通过new关…

uni-app打包证书android

Android平台打包发布apk应用&#xff0c;需要使用数字证书&#xff08;.keystore文件&#xff09;进行签名&#xff0c;用于表明开发者身份。 Android证书的生成是自助和免费的&#xff0c;不需要审批或付费。 可以使用JRE环境中的keytool命令生成。 以下是windows平台生成证…

MySQL、Oracle的时间类型字段自动更新:insert插入、update更新时,自动更新时间戳。设置自增主键id,oracle创建自增id序列和触发器

1. MySQL 支持设置自增id的字段类型&#xff1a;int、bigint、double等数值类型&#xff0c;一般用int、bigint支持设置自动更新时间的字段类型&#xff1a;datetime、timestamp下面sql中的now()函数可以用current_timestamp()替代 1.1. 不指定秒精度 drop table if exists …

Ollama 在本地快速部署大型语言模型,可进行定制并创建属于您自己的模型

# Ollama 在本地快速部署并运行大型语言模型。 macOS 点击下载 Windows 预览版 点击下载 Linux curl -fsSL https://ollama.com/install.sh | sh手动安装指南 Docker 官方的 Ollama Docker 镜像 ollama/ollama 已经在 Docker Hub 上发布。 库 ollama-pythonollama-js…

超详细测试项目——Web电商项目测试点整理.....

虽然说近些年来&#xff0c;软件测试找工作的时候&#xff0c;简历中如果写着电商项目被认为是烂大街的项目&#xff0c;甚至受到根本不了解行情的HR或者部分公司的技术人员的刁难&#xff0c;但是&#xff1a;电商这么流行普遍的项目和应用&#xff0c;这不是很正常么&#xf…

阿里云2核4G云服务器165元一年,ECS u1优惠价格199元一年

阿里云2核4G服务器租用优惠价格&#xff0c;轻量2核4G服务器165元一年、u1服务器2核4G5M带宽199元一年、云服务器e实例30元3个月&#xff0c;活动链接 aliyunfuwuqi.com/go/aliyun 活动链接如下图&#xff1a; 阿里云2核4G服务器优惠价格 轻量应用服务器2核2G4M带宽、60GB高效…

浅谈数据治理之道 数据采集(二)

数据采集是数据治理过程中的一个非常关键和重要地环节&#xff0c;不仅关系到数据的及时性、准确性、完整性和有效性等&#xff0c;还涉及到数据的安全和隐私。其次&#xff0c;涉及到从各种数据源获取原始数据&#xff0c;并将其转换为适合进一步处理和分析的格式。今天 咱们就…

如何从小白,到掌握Python

作为前端开发人员想要掌握Python编程语言&#xff0c;以下是一个学习路径建议&#xff1a; ### 初级阶段&#xff1a; 1. **学习Python基础&#xff1a;** - 学习Python的基本语法、数据类型、流程控制等基础知识。 - 可以通过在线教程、书籍或视频课程来学习&#xff…

Android单片机硬件通信《GPIO通信》

一、什么是GPIO? GPIO&#xff08;英语&#xff1a;General-purpose input/output&#xff09;&#xff0c;通用型输入输出端口&#xff0c;在单片机上一般是通过一个GND引脚和若干个io引脚配合工作。 单片机可以配置GPIO输入输出模式,与外界环境进行通信交互。在输入环境下&…

网络传输(3):TFTP客户端使用

1. 简要说明 在前面的文章中已经讲述了如何安装TFTP客户端和TFTP服务器。其中&#xff1a; tftp-hpa为客户端 tftpd-hpa为服务器。 2. 启动TFTP服务器 我们在设置好相关的TFTP根路径&#xff0c;运行模式以后&#xff0c;可以通过如下指令重启TFTP服务器&#xff0c;使设置生…