微服务: 04-springboot中rabbitmq配置,消息回收,序列化方式

目录

1. 本文简介: 

1.1 java序列化的缺点

---> 1.1.1 无法跨语言

--->1.1.2  易被攻击

---> 1.1.3 序列化后的流太大

---> 1.1.4 序列化性能太差

2. 配置总览

2.1  基础配置

 2.2 连接重试配置

 2.3  异常重试机制

2.4 确认模式(本篇是自动)

 ---> 2.4.1 如图所示

2.5 发送确认设置

 ---> 2.5.1 参数解释: (老版的功能 直接是一个布尔值 false不开启  true开启)

---> 2.5.2  写一个callbackConfig, 重写方法

 2.6 重新配置序列化

---> 方法一: 都以application/json传递接收

---> 方法二:  都以application/json传递接收

 ---> 展示效果: 

3. 配置总结

3.1 完整的application.properties的配置

3.2 完整的application.yml配置

4. 文章传送门  

5. 下文预告


1. 本文简介: 

rabbitmq的连接配置, 以及回收机制配置, 修改默认java序列化方式

1.1 java序列化的缺点

---> 1.1.1 无法跨语言

 serialVersionUID版本号必须相同,相同类名 版本号不一样 反序列化失败

--->1.1.2  易被攻击

Apache Commons Collections 允许链式的任意的类函数反射调用,攻击者通过“实现了 Java 序列化协议”的端口,把攻击代码上传到服务器上,再由 Apache Commons Collections 里的 TransformedMap 来执行。

---> 1.1.3 序列化后的流太大

Java 序列化实现的二进制编码完成的二进制数组大小,比 ByteBuffer 实现的二进制编码完成的二进制数组大小要大上几倍。

---> 1.1.4 序列化性能太差

ObjectOutputStream序列化效率很低

2. 配置总览

2.1  基础配置

#基础配置
spring.rabbitmq.host=*
spring.rabbitmq.port=5672
spring.rabbitmq.username=pzy
spring.rabbitmq.password=*
spring.rabbitmq.virtual-host=develop

 2.2 连接重试配置

# 开启rabbit初始化重试机制
spring.rabbitmq.template.retry.enabled=true
## 最大重试间隔时间
spring.rabbitmq.template.retry.max-interval=1000ms
## 最大重试次数
spring.rabbitmq.template.retry.max-attempts=3
# 间隔乘数
spring.rabbitmq.template.retry.multiplier=1
# 初始化的时间间隔
spring.rabbitmq.template.retry.initial-interval=1000ms

 2.3  异常重试机制

#异常重试机制设置[未加死信队列 五次异常后 直接抛弃了]
#设置是否重回队列 true即出现异常会将消息重新发送到队列中
spring.rabbitmq.listener.simple.default-requeue-rejected=true
#设置是否启用消息重试机制,默认为false。
spring.rabbitmq.listener.simple.retry.enabled=true
#设置消息重试的最大次数,默认为3。
spring.rabbitmq.listener.simple.retry.max-attempts=5
#设置消息重试的初始间隔时间,默认为1000ms。
spring.rabbitmq.listener.simple.retry.initial-interval=2000ms
#设置消息重试的时间间隔倍数,默认为1(重试时间越来越长)
spring.rabbitmq.listener.simple.retry.multiplier=1.2
##设置消息重试的最大时间间隔,默认为10000ms。
spring.rabbitmq.listener.simple.retry.max-interval=3000ms

2.4 确认模式(本篇是自动)

#spring.rabbitmq.listener.simple.acknowledge-mode=none
spring.rabbitmq.listener.simple.acknowledge-mode=auto
#spring.rabbitmq.listener.simple.acknowledge-mode=manual
#spring.rabbitmq.listener.direct.acknowledge-mode=manual

 ---> 2.4.1 如图所示

 

2.5 发送确认设置

#发布消息成功到交换器后会触发回调方法(默认禁用none)
spring.rabbitmq.publisher-confirm-type=correlated
#消息发布不可达目的地的时候 才进行回退
spring.rabbitmq.publisher-returns=true

 ---> 2.5.1 参数解释: (老版的功能 直接是一个布尔值 false不开启  true开启)

None 禁用发布确认模式,是默认值
CORRELATED 发布消息成功到交换机后会触发回调方法
SIMPLE  有两种效果: 

其一: 效果和 CORRELATED 值一样会触发回调方法

其二: 在发布消息成功 使用 rabbitTemplate 调用 waitForConfirms 或 waitForConfirmsOrDie 方法 等待 broker 节点返回发送结果,根据返回结果来判定下一步的逻辑,要注意的点是 waitForConfirmsOrDie 方法如果返回 false 则会关闭 channel,无法发送消息到 broker

---> 2.5.2  写一个callbackConfig, 重写方法

package com.aisce.axmall.order.config.rabbitmq;import lombok.NonNull;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.context.annotation.Configuration;/*** rabbitmq的成功与失败* 消息回调* @author pzy* @description: TODO* @version 1.0.1 beta版*/
@Slf4j
@Configuration
public class RabbitCallbackConfig implements RabbitTemplate.ConfirmCallback, RabbitTemplate.ReturnCallback {/*** 消息正常发送 或者发送到broker后出现问题* @param correlationData* @param ack* @param cause*/@Overridepublic void confirm(CorrelationData correlationData, boolean ack, String cause) {if (!ack) {log.error("confirm==>发送到broker失败\r\n" + "correlationData={}\r\n" + "ack={}\r\n" + "cause={}",correlationData, ack, cause);} else {log.info("confirm==>发送到broker成功\r\n" + "correlationData={}\r\n" + "ack={}\r\n" + "cause={}",correlationData, ack, cause);}}/*** 压根没到目的地 执行* @param message* @param replyCode* @param replyText* @param exchange* @param routingKey*/@Overridepublic void returnedMessage(@NonNull Message message, int replyCode,@NonNull String replyText, @NonNull String exchange, @NonNull String routingKey) {log.error("error returnedMessage==> \r\n" + "message={}\r\n" + "replyCode={}\r\n" +"replyText={}\r\n" + "exchange={}\r\n" + "routingKey={}",message, replyCode, replyText, exchange, routingKey);}//可进行后续操作}

 2.6 重新配置序列化

有两种方式(原理差不多)

---> 方法一: 都以application/json传递接收

@Configuration
public class RabbitConfig {
@Bean
public MessageConverter messageConverter(){return new Jackson2JsonMessageConverter();
}

---> 方法二:  都以application/json传递接收

/*** rabbitmq配置类** @author pzy* @version 0.1.0* @description: TODO*/
@Configuration
public class RabbitConfig {@Autowiredprivate SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory;@Autowiredprivate RabbitCallbackConfig rabbitCallbackConfig;@BeanRabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);//消息到不到队列 自动重新返回到生产者rabbitTemplate.setMandatory(true);//其实前面配置加了rabbitTemplate.setConfirmCallback(rabbitCallbackConfig);rabbitTemplate.setReturnCallback(rabbitCallbackConfig);// 使用 JSON 序列化与反序列化rabbitTemplate.setMessageConverter(new Jackson2JsonMessageConverter());rabbitListenerContainerFactory.setMessageConverter(new Jackson2JsonMessageConverter());return rabbitTemplate;}
}

 ---> 展示效果: 


3. 配置总结

3.1 完整的application.properties的配置

#beta版 rabbitmq V3.0.1 版本启动测试  pzy===============================================>
#基础配置
spring.rabbitmq.host=*
spring.rabbitmq.port=5672
spring.rabbitmq.username=pzy
spring.rabbitmq.password=*
spring.rabbitmq.virtual-host=develop
#发送确认机制设置
#发布消息成功到交换器后会触发回调方法(默认禁用none)
spring.rabbitmq.publisher-confirm-type=correlated
#消息发布不可达目的地的时候 才进行回退
spring.rabbitmq.publisher-returns=true# 队列设置
#设置每次预抓取的数量是3,处理完之前不收下一条 默认250
spring.rabbitmq.listener.simple.prefetch=3
# 手动确认模式
#spring.rabbitmq.listener.simple.acknowledge-mode=manual
spring.rabbitmq.listener.simple.acknowledge-mode=auto
#spring.rabbitmq.listener.direct.acknowledge-mode=manual# 开启rabbit初始化重试机制
spring.rabbitmq.template.retry.enabled=true
## 最大重试间隔时间
spring.rabbitmq.template.retry.max-interval=1000ms
## 最大重试次数
spring.rabbitmq.template.retry.max-attempts=3
# 间隔乘数
spring.rabbitmq.template.retry.multiplier=1
# 初始化的时间间隔
spring.rabbitmq.template.retry.initial-interval=1000ms#异常重试机制设置[未加死信队列 五次异常后 直接抛弃了]
#设置是否重回队列 true即出现异常会将消息重新发送到队列中
spring.rabbitmq.listener.simple.default-requeue-rejected=true
#设置是否启用消息重试机制,默认为false。
spring.rabbitmq.listener.simple.retry.enabled=true
#设置消息重试的最大次数,默认为3。
spring.rabbitmq.listener.simple.retry.max-attempts=5
#设置消息重试的初始间隔时间,默认为1000ms。
spring.rabbitmq.listener.simple.retry.initial-interval=2000ms
#设置消息重试的时间间隔倍数,默认为1(重试时间越来越长)
spring.rabbitmq.listener.simple.retry.multiplier=1.2
##设置消息重试的最大时间间隔,默认为10000ms。
spring.rabbitmq.listener.simple.retry.max-interval=3000ms# beta版 ============================================================================>

3.2 完整的application.yml配置

properties 转成 yml 后 注释没了 具体看上面的

#只有服务的消费者 决定怎么消费确认 生产者决定不了
spring: rabbitmq:listener:simple:acknowledge-mode: manualdefault-requeue-rejected: trueretry:enabled: trueinitial-interval: 2000msmax-attempts: 5max-interval: 3000msmultiplier: 1.2host: *    port: 5672username: pzypassword: *virtual-host: develop# 新版的就是publisher-confirm-type=correlatedpublisher-confirms: truepublisher-returns: truetemplate:retry:enabled: trueinitial-interval: 1000msmax-attempts: 3max-interval: 1000msmultiplier: 1

4. 文章传送门  

微服务: 00-rabbitmq出现的异常以及解决方案

微服务: 01-rabbitmq的应用场景及安装(docker)

微服务 02-rabbitmq在springboot中如何使用(上篇)

微服务: 03-rabbitmq在springboot中如何使用(下篇)

5. 下文预告

微服务: 05-rabbitmq设置重试次数并设置死信队列 

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

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

相关文章

linux文件系统只读导致监听异常

项目经理发来截图,监听无法启动了,截图如下 orcl:/home/oraclehydb> lsnrctl start LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 18-JUL-2023 11:29:54 Copyright (c) 1991, 2013, Oracle. All rights reserved. Starting /u01/app/…

QML 入门

QML 入门 Qt 基本模块Qt Quick 开发所需基本技术QML 基本语法QML 数据类型基本数据类型(39)boolcolor 颜色类型coordinate 坐标类型date 日期时间类型doubleenumeration 枚举类型font 字体类型geocircle 几何圆数据类型geopath 几何路径数据类型geopolyg…

从浏览器输入url到页面加载(六)前端必须了解的路由器和光纤小知识

前言 上一章我们说到了数据包在网线中的故事,说到了双绞线,还说到了麻花。这一章继续沿着这条线路往下走,说一些和cdn以及路由器相关,运营商以及光纤相关的小知识,前端同学应该了解一下的 目录 前言 1. CDN和路由器…

自定义类型详解(C语言)

自定义类型 一. 结构体1.1 什么是结构体1.2 结构体的声明1.3 特殊的声明1.4 结构体的自引用1.5 结构体变量的定义和初始化1.5.1 结构体变量的定义1.5.2 结构体变量的初始化 1.6 结构体内存对齐1.6.1 为什么存在内存对齐 1.7 修改默认对齐数1.8 结构体传参 二. 位段2.1 什么是位…

OCR学术前沿及产业应用高峰论坛202204

OCR学术前沿及产业应用高峰论坛 相关议程:https://mp.weixin.qq.com/s/LYoKHFad9D-gjhGlVF3Czg 广告OCR技术研究与应用-腾讯 视频制作ASR,ocr得到字幕 计算机动画CG OCR实践与技术创新 - 蚂蚁 loss优化 数据合成 对比学习的方式,什么样是…

冯诺依曼体系结构

文章目录 一.冯诺依曼体系结构的主要组成部分1.输入设备 & 输出设备2.存储器3.运算器 & 控制器 二.为什么这么设计三.现实案例 一.冯诺依曼体系结构的主要组成部分 当代的计算机,本质上都是一堆硬件的集合(CPU、内存、磁盘、显卡等)…

【C++】命名空间 ( namespace )

目录搁这 什么是命名空间命名空间的作用如何定义命名空间命名空间的种类如何使用命名空间内的成员作用域限定符命名空间展开命名空间全部展开命名空间部分展开 总结 什么是命名空间 命名空间是一种用来避免命名冲突的机制,它可以将一段代码的名称隔离开&#xff0c…

纯CSS实现的卡片切换效果

纯CSS实现的卡片切换效果 无需JS就可以实现限于纯静态页面产品展示不需要轮播,自动切换 示例代码 <template><div class"example-css-tab"><div class"container dwo"><div class"card"><input type"radio"…

【实战总结】SpringMVC架构升级SpringCloudAlibaba

升级目标 SpringMVCDubboZookeeper分布式架构改为Spring Cloud Alibaba微服务 技术框架:Spring Boot 2.7.2、Spring Cloud 2021.0.3 & Alibaba 2021.0.1.0 容器:Tomcat 9.0.65 JDK:1.8 配置中心:Nacos 2.0.4 消息队列:RocetMQ 4.9.3 配置中心:Apollo 11.0 缓存: Redis 4.0…

【C语言】杨氏矩阵中寻找元素

题目名称&#xff1a; 杨氏矩阵 题目内容&#xff1a; 有一个数字矩阵&#xff0c;矩阵的每行从左到右是递增的&#xff0c;矩阵从下到上递增的&#xff08;杨氏矩阵的定义&#xff09;&#xff0c;请编写程序在这样的矩阵中查找某个数字是否存在。 形如这样的矩阵就是杨氏…

chatglm微调

chatGML 看到 【【官方教程】ChatGLM-6B 微调&#xff1a;P-Tuning&#xff0c;LoRA&#xff0c;Full parameter】 【精准空降到 15:27】 https://www.bilibili.com/video/BV1fd4y1Z7Y5/?share_sourcecopy_web&vd_sourceaa8c13cff97f0454ee41e1f609a655f1&t927 记得看…

一文了解Docker之网络模型

目录 1.Docker网络 1.1 Docker网络模型概述 1.2 Docker网络驱动程序 1.2.1 host模式 1.2.2 bridge模式 1.2.3 container模式 1.2.4 none模式 1.3 Docker网络命令示例 1.3.1 创建一个自定义网络 1.3.2 列出所有网络 1.3.3 连接容器到网络 1.3.4 断开容器与网络的连接…

SpringCloud(三)LoadBalancer负载均衡

一、负载均衡 实际上&#xff0c;在添加LoadBalanced注解之后&#xff0c;会启用拦截器对我们发起的服务调用请求进行拦截&#xff08;注意这里是针对我们发起的请求进行拦截&#xff09;&#xff0c;叫做LoadBalancerInterceptor&#xff0c;它实现ClientHttpRequestIntercep…

Android 系统的分区介绍

由于Android系统采用Linux架构&#xff0c;所以Android的系统分区可以类比同样采用Linux架构的操作系统&#xff08;如Windows&#xff09;。 Android系统分区分类 现在一般常见的Android分区方式共有三种&#xff0c;在不同的Android系统版本上会采用不同的分区方式。 1、传…

Postman接口自动化之postman脚本编写

这是之前搞的接口自动化方案&#xff0c;已经在业务测试中实现了使用postman编写接口脚本&#xff0c;通过GitHubJenkinsemail html report实现了接口自动化&#xff0c;现在分块整理一下。 postman脚本编写 1、创建集合 和 目录&#xff1a; 一条业务线下的接口可以放到一个…

sonarqube安装并配置CI/CD

sonarqube安装使用 目录 简介效果(配置在下面查看)官方文档环境准备配置compose-sonarqube.yml启动登录集成Gitlab 获取私钥sonarqube配置gitlab查看项目 配置 手动方式Gitlab CI/CD 自动检测 简介 SonarQube是一个开源的代码质量管理平台&#xff0c;用于对代码进行静态代…

【数学建模】——相关系数

第一部分&#xff1a;皮尔逊相关系数的计算以及数据的描述性统计 本讲我们将介绍两种最为常见的相关系数&#xff1a;皮尔逊person相关系数和斯皮尔曼spearman等级相关系数。它们可以用来衡量两个变量之间的相关性的大小&#xff0c;根据数组满足的不同条件&#xff0c;我们要选…

Monocular 3D Object Detection with Depth from Motion 论文学习

论文链接&#xff1a;Monocular 3D Object Detection with Depth from Motion 1. 解决了什么问题&#xff1f; 从单目输入感知 3D 目标对于自动驾驶非常重要&#xff0c;因为单目 3D 的成本要比多传感器的方案低许多。但单目方法很难取得令人满意的效果&#xff0c;因为单张图…

QT之智能指针

如果没有智能指针&#xff0c;程序员必须保证new对象能在正确的时机delete&#xff0c;四处编写异常捕获代码以释放资源&#xff0c;而智能指针则可以在退出作用域时(不管是正常流程离开或是因异常离开)总调用delete来析构在堆上动态分配的对象。 来看看一个野指针例子 程序将会…

java学习路程之篇三、知识点、类、模块、项目、操作、下载、安装、IDEA

文章目录 1、IDEA开发工具2、IDEA的下载和安装3、IDEA中的第一个代码4、IDEAZ中的类、模块、项目的操作 1、IDEA开发工具 2、IDEA的下载和安装 3、IDEA中的第一个代码 4、IDEAZ中的类、模块、项目的操作