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

这篇具有很好参考价值的文章主要介绍了微服务: 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 如图所示

 微服务: 04-springboot中rabbitmq配置,消息回收,序列化方式,# 分布式必备服务配置,java-rabbitmq,微服务,spring boot,rabbitmq,java

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
     */
    @Override
    public 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
     */
    @Override
    public 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 {

    @Autowired
    private SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory;

    @Autowired
    private RabbitCallbackConfig rabbitCallbackConfig;

    @Bean
    RabbitTemplate 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;
    }
}

 ---> 展示效果: 

微服务: 04-springboot中rabbitmq配置,消息回收,序列化方式,# 分布式必备服务配置,java-rabbitmq,微服务,spring boot,rabbitmq,java


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: manual
        default-requeue-rejected: true
        retry:
          enabled: true
          initial-interval: 2000ms
          max-attempts: 5
          max-interval: 3000ms
          multiplier: 1.2
    host: *    
    port: 5672
    username: pzy
    password: *
    virtual-host: develop
    # 新版的就是publisher-confirm-type=correlated
    publisher-confirms: true
    publisher-returns: true
    template:
      retry:
        enabled: true
        initial-interval: 1000ms
        max-attempts: 3
        max-interval: 1000ms
        multiplier: 1
    

4. 文章传送门  

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

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

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

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

5. 下文预告

微服务: 05-rabbitmq设置重试次数并设置死信队列 文章来源地址https://www.toymoban.com/news/detail-582119.html

到了这里,关于微服务: 04-springboot中rabbitmq配置,消息回收,序列化方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • RabbitMQ 消息对象通过 Jackson 库消息转化器 序列化/反序列化 天坑!

    目录 1. 报错的背景 2. 问题分析 3. 最佳解决办法 a)使用 RabbitMQ 发送消息时,发送消息的类型为 MapString, Object,map 里面我 put 了一个 String, Long 类型,如下图: b)这里有一个前提:我清楚使用 org.springframework.amqp.rabbit.core.RabbitTemplate 来发送消息到 RabbitMQ 队列时,消息的序列

    2024年04月15日
    浏览(60)
  • 195、SpringBoot--配置RabbitMQ消息Broker的SSL 和 管理控制台的HTTPS

    开启Rabbitmq的一些命令: 小黑窗输入: rabbitmq-plugins enable rabbitmq_management 启动控制台插件,就是启动登录rabbitmq控制台的页面 rabbitmq_management 代表了RabbitMQ的管理界面。 rabbitmq-server 启动rabbitMQ服务器 上面这个:rabbitmq-plugins enable rabbitmq_management 启动控制台插件,就是启动登录

    2024年02月03日
    浏览(52)
  • Idea+maven+springboot项目搭建系列--2 整合Rabbitmq完成客户端&服务器端消息收发

    前言:本文通过springBoot -maven 框架,对Rabbitmq 进行整合,完成客户端消息的发送和消费; 1 为什么要使用Rabbitmq: RabbitMQ 是一个可靠的、灵活的、开源的消息中间件,具有以下优点: 异步通信:RabbitMQ 支持异步通信,使得消息发送者和接收者能够异步处理,提高了系统性能和

    2024年02月07日
    浏览(58)
  • RabbitMQ保证消息的可靠投递,Java实现RabbitMQ消息的可靠投递,Springboot实现RabbitMQ消息的可靠投递

    我们先看一串代码,并思考一下为什么要先入库然后发MQ: 如果先发MQ的话,如果入库失败,就会导致MQ消息无法回滚了。今天我们就好好聊一聊RabbitMQ消息可靠投递的问题。 ① 消息从生产者发送到Broker 生产者把消息发送到Broker之后,如何知道自己的消息有没有被Broker成功接

    2024年02月11日
    浏览(55)
  • SpringBoot: RabbitMQ消息队列之同时消费多条消息

    1. basicQos预取方法参数解析 basicQos(int prefetchCount) basicQos(int prefetchCount, boolean global) basicQos(int prefetchSize, int prefetchCount, boolean global) 参数: prefetchSize:可接收消息的大小 prefetchCount:处理消息最大的数量。 global:是不是针对整个Connection的,因为一个Connection可以有多个Channel,如

    2024年02月01日
    浏览(74)
  • Springboot与RabbitMQ消息超时时间、队列消息超时时间

    TTL是 Time-To-Live 的缩写,RabbitMQ可以对消息和队列设置TTL(过期时间)。 RabbitMQ针对队列中的消息过期时间(Time To Live, TTL)有两种方法可以设置。 第一种方法是通过队列属性设置,队列中所有消息都有相同的过期时间。 第二种方法是对消息进行单独设置,每条消息TTL可以不同。

    2024年02月09日
    浏览(48)
  • 【SpringBoot笔记29】SpringBoot集成RabbitMQ消息队列

    这篇文章,主要介绍SpringBoot如何集成RabbitMQ消息队列。 目录 一、集成RabbitMQ 1.1、引入amqp依赖 1.2、添加连接信息 1.3、添加RabbitMQ配置类

    2023年04月08日
    浏览(57)
  • SpringBoot RabbitMQ 实现消息队列功能

    作者:禅与计算机程序设计艺术 在企业级应用中,为了提升系统性能、降低响应延迟、改善用户体验、增加系统的稳定性、提高资源利用率等方面所需的功能之一就是使用消息队列。RabbitMQ是一个开源的AMQP(Advanced Message Queuing Protocol)的实现消息队列,它是用Erlang语言开发的。

    2024年02月09日
    浏览(48)
  • Springboot Jackson 序列化与反序列化配置

    可解决在使用默认反序列化Jackson时,LocalDateTime类型的请求参数反序列化失败的问题

    2024年02月02日
    浏览(43)
  • Springboot整合RabbitMQ消息中间件

    spring-boot-rabbitmq–消息中间件整合 前言:RabbitMQ的各种交换机说明 1、直连交换机 生产者发布消息时必须带着routing-key,队列绑定到交换机时必须指定binding-key ,且routing-key和binding-key必须完全相同,如此才能将消息路由到队列中 直连交换机通常用来循环分发任务给多个workers,

    2024年02月11日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包