rabbitMQ延迟队列和发布确认(springboot版)

Spring Boot 整合 Spring AMQP 基于SpringBoot和SpringAMQP的手动消息确认的整合 阅读详情

1.处理延迟队列

2.处理发布确认

首先流程图以及各名称设置如下,争对ttl过期时间设置位置的解释

 创建springboot工程,导入以下依赖

 <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!--        Rabbi tMQ 依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

        <!--        阿里巴巴类型转换-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.47</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!--        swagger-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version>
        </dependency>
        <!--        Rabbi tMQ 测试依赖-->
        <dependency>
            <groupId>org.springframework.amqp</groupId>
            <artifactId>spring-rabbit-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

开启rabbitMQ客户端

 yml配置文件配置如下(连接rabbitmq密码用户名这些都是你的)

server:
  port: 8084
spring:
  rabbitmq:
    password: 123456
    username: admin
    host: 192.168.17.141
    port: 5672
    #发布消息到交换器后会触发回调方法  (成功失败都会)
    publisher-confirm-type: correlated
    #回退消息配置  、消息退回生产者 (失败才会)
    publisher-returns: true

编写代码,首先需要有swagger配置类

package com.delayandadvanced.config;


import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration
@EnableSwagger2

public class SwaggerConfig {
    @Bean
    public Docket webApiConfig ( ) {

        return new Docket( DocumentationType. SWAGGER_2)
                . groupName ( "webApi" )
                . apiInfo (webApiInfo ( ) )
                . select ( )
                . build ( );
    }
    private ApiInfo webApiInfo ( ) {

        return new ApiInfoBuilder( )
                . title ( "rabbitmq 接口文档 " )
                . description ( "本文档描述了 rabbitmq 微服务接口定义" )
                . version ( " 1 . 0 " )
                . contact (new Contact( "enjoy6288 " , "http : //baidu. com" ,

                        " 1900168534@qq . com" ) )
                . build ( ) ;
    }
}

重要的一步,编写rabbitMQ配置类

package com.delayandadvanced.config;

import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;

/**
 * 编写配置  声明队列 交换机   绑定关系
 */
@Configuration
public class RabbitmqConfig {
    //交换机名称
    public static final String X_EXCHANGE="x_exchange";
    //死信交换机名称
    public static final String Y_EXCHANGE="y_exchange";
    //队列
    public static final String X_QUEUE="x_queue";
    //死信队列
    public static final String Y_QUEUE="y_queue";
    
    //声明队列
    @Bean
    public Queue xQueue(){
        Map<String,Object> arguments=new HashMap<>(3);
        /*设置队列中的消息过期后到指定的死信交换机,通过路由到死信队列*/
        arguments.put("x-dead-letter-exchange",Y_EXCHANGE);
        arguments.put("x-dead-letter-routing-key","dead-rout");
        /*设置ttl过期时间 单位为ms*/
        arguments.put("x-message-ttl",10000);
        return QueueBuilder.durable(X_QUEUE).withArguments(arguments).build();
    }
    //声明死信队列
    @Bean
    public Queue yQueue(){
        return QueueBuilder.durable(Y_QUEUE).build();
    }

    //声明交换机 类型为direct
    @Bean
    public DirectExchange xExchange(){
        return new DirectExchange(X_EXCHANGE);
    }
    //声明死信交换机 
    @Bean
    public DirectExchange yExchange(){
        return new DirectExchange(Y_EXCHANGE);
    }

    //队列与交换机进行绑定
    @Bean
    public Binding xQueueAndXexchange(
            @Qualifier("xQueue")Queue queue,
            @Qualifier("xExchange")DirectExchange exchange){
        return BindingBuilder.bind(queue).to(exchange).with("rout");
    }
    //死信队列与死信交换机进行绑定
    @Bean
    public Binding yQueueAndYexchange(
            @Qualifier("yQueue")Queue queue,
            @Qualifier("yExchange")DirectExchange exchange
    ){
        return BindingBuilder.bind(queue).to(exchange).with("dead-rout");
    }
}

配置发布确认,注意一定要把当前类注入到内部接口中

package com.delayandadvanced.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.ReturnedMessage;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

/**
 * 配置发布确认
 * 
 * 交换机消息回调
 * 队列退回处理
 *
 */
@Slf4j
@Component
public class MyCallBack implements RabbitTemplate.ConfirmCallback,RabbitTemplate.ReturnsCallback {
  @Autowired
  private RabbitTemplate rabbitTemplate;
  
//因为ConfirmCallback和ReturnsCallback是内部接口,
// MyCallBack实现RabbitTemplate并没有注入到ConfirmCallback和ReturnsCallback中
  @PostConstruct
  public void init(){ //this指的就是MyCallBack
      rabbitTemplate.setReturnsCallback(this);
      rabbitTemplate.setConfirmCallback(this);
  }

/** 交换机回调成功或者失败*/
    @Override
    public void confirm(CorrelationData correlationData, boolean ack, String cause) {
        //三元运算符  id为生产者发送消息是设置的
        String id=correlationData==null?"":correlationData.getId();
        if (ack){
           log.info("交换机接收到的id为:{}",id);
        }else {
            log.info("交换机没有收到id为:{},原因是:{}",id,cause);
        }
    }
/**队列只回调失败*/
    @Override
    public void returnedMessage(ReturnedMessage returned) {//这里把参数进行了分装,如果你的版本高则跟我一样
  /*public ReturnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {*/
  
        Message message = returned.getMessage();
        String exchange = returned.getExchange();
        String routingKey = returned.getRoutingKey();
        String replyText = returned.getReplyText();
        log.error("消息:{},被交换机:{}退回,退回原因是:{},路由routingKey是;{}",
                new String(message.getBody()),exchange,replyText,routingKey);

    }

}

编写生产者

package com.delayandadvanced.controller;

import com.delayandadvanced.config.RabbitmqConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.MessagePostProcessor;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import java.util.Date;

/**
 * 生产者 发布消息
 */
@Slf4j
@RestController
public class ProducerController {
    @Autowired
    private RabbitTemplate rabbitTemplate;
    @Autowired
    @Qualifier("xExchange")
    private DirectExchange xExchange; //交换机名我采用从容器中获取的方式

    @GetMapping("/hello/{message}")
    public void message(@PathVariable("message")String message){
        log.info("当前时间:{},发送一条:{}消息给队列",new Date().toString(),message);
        //设置id
        CorrelationData correlationData=new CorrelationData();
        correlationData.setId("111");
        //进行发布
        rabbitTemplate.convertAndSend(xExchange.getName(), "rout","消息来自ttl为10秒的队列,消息是:"+message,correlationData);


    }

}

编写消费者,通过监听指定队列进行消费

package com.delayandadvanced.consumer;

import com.delayandadvanced.config.RabbitmqConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import java.util.Date;

@Slf4j
@Component
public class TestConsumer {

    /* 监听死信队列*/
    @RabbitListener(queues = RabbitmqConfig.Y_QUEUE)
    public void message(Message message){
        log.info("当前时间:{},死信队列接收到的消息为:{}",new Date(),new String(message.getBody()));
    }
}

现在启动工程,一切配置都正常时,在浏览器发送消息

可以看到控制台输出,队列和交换机没有任何问题,10秒过后消息被消费

 现在改变交换机名称,模拟生产者发消息时,没有交换机(等同于交换机挂掉)

 

现在重启工程,进行重新发送消息 ,可以看到消息被退回

现在把交换机设置为正常,把交换机与队列之间的路由routingKey进行修改,模拟队列挂掉

现在重启工程,进行重新发送消息 ,可以看到消息被回退到生产者

 到此,关于延迟队列ttl设置在队列处和确认发布演示完毕,如有错误还请指出,大家一起学习

 

RabbitMQ 3.9( 续 ) 🚀 优质资源分享 🚀 学习路线指引(点击解锁) 知识定位 人群定位 🧡 Python实战微信订餐小程序 🧡 进阶级 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。 💛Python量化交易实战💛 入门级 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统 目录 前言 基础篇链接:https://blog.youkuaiyun.com/xiegongzi/p/16229678.html 3.9、延迟队列 - 重要 3.9.1、 阅读详情

相关推荐

springboot+rabbitmq实现延时队列

springboot+rabbitmq实现延时队列,包括消息发送和消费确认,消费者端使用策略模式处理业务

【RabbitMQ】SpringBoot整合RabbitMQ实现延迟队列、TTL、DLX死信队列

TTL(Time To Live):存活时间/过期时间,在RabbitMQ里表示消息从生产者到服务器后该消息的存活时间,一旦到达时长该消息就会被自动清除死信队列英文缩写DLX,Dead Letter Exchange(死信交换机)当消息成为死消息后,可以被重新发送到另一个交换机,这个交换机就是死信交换机,在由该交换机转发给相应的死信队列在RabbitMQ里当消息到达队列后不会立马被消费者消费,而是到达指定的时间才会被消费。

qq_61903414的博客 2390

CoppeiaSim(VREP)入门

vrep/CoppeliaSim关节抖动问题原因总结【Coppeliasim|轨迹规划(一)】设置机械臂的关节角时保证机械臂不散架设置机械臂的关节角时保证机械臂不散架。

weixin_50624597的博客 3227

【中间件】Springboot & RabbitMQ 延时队列的使用

一、问题来源 针对业务需求当MQ异步推送数据上链时,消费服务端通过业务主键ID查询业务记录时,由于生产业务逻辑处理,在消费者消费上链数据时,生产者未及时进行事务提交,导致消费者无法查询到业务记录,导致上链失败,需要对上链数据进行延迟处理,确认数据处理完成事务提交在进行上链。 二、什么是延迟队列 针对特殊场景需要进行延时处理的消息,放入延时队列中会被延时消费处理,普通消息队列对于加入的消息会及时消费。使用场景以下几个 延时消费:订单类状态超时处理,数据消费延后补发处理; 延时重试:数据消费失败时想进行过段时

贪吃的蚂蚁#博客 1317

ESP32S3学习——i2c,点亮0.96寸oled

ESP32S3学习——i2c,点亮0.96寸oled

HandBAI的博客 1万+

RK3568 开发实战:手动构建 Linux 4.19 内核镜像与设备树优化

本文详细介绍了为RK3568开发板手动编译Linux 4.19内核的完整实战流程。从环境搭建、源码获取、内核配置,到设备树深度定制与优化,再到镜像打包与烧写,旨在帮助开发者脱离官方SDK依赖,实现对嵌入式Linux系统的完全掌控,提升硬件适配与性能优化能力。

weixin_29175469的博客 269

Rabbitmq之整合Springboot,普通队列以及死信队列demo实例,队列优化以及插件实现延迟队列

1、引入pom.xml依赖 <?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 http://maven.a

花&败 503

【ROS2】Arduino系列之机器人底盘实现

介绍ros中提供的一个已经封装了的模块: ros_arduino_bridge,该模块由下位机驱动和上位机控制两部分组成,通过该模块可以更为快捷、方便的实现自己的机器人平台

guilin 1486

rabbitmq+springboot延迟队列实现及发布确认

springboot环境使用rabbitmq做到延迟队列,发布确认

qq_54962034的博客 867

【部署】Kimi 接入OpenClaw完整步骤及关键注意事项

本文详细介绍了如何将Kimi AI接入OpenClaw系统的完整步骤。首先需确保环境满足OpenClaw版本要求和系统支持,然后通过配置向导完成本地网关设置和Kimi模型接入,包括API密钥配置。文章提供了详细的命令操作和界面截图指导,并重点说明了安全警告处理、服务状态检查、API密钥有效性验证等关键注意事项。最后还展示了Kimi流量消耗明细和问题排查方法,帮助用户顺利完成接入并解决常见问题。整个流程清晰明了,涵盖了从环境准备到最终验证的全部环节。

海兰 7188

SAP会计凭证导入ABAP开发模板+注意点—附带源码

开发并不仅仅只要考虑实现的功能,只实现功能的是程序,考虑到使用场景的是工程。使用bapi校验创建会计凭证的数据,报错和参数和正式创建一致。用途,防止产生错误的凭证,即使财务凭证可以冲销。正式创建会计凭证。隐藏的坑。

小九啥也不会 1232

RabbitMQ 发布确认 交换机 死信队列 延迟队列

RabbitMQ学习笔记

m0_62434717的博客 746

聊聊蓝牙配对技术-CTKD OVER BR/EDR

摘要:本文探讨了蓝牙设备通过跨传输密钥派生(CTKD)机制实现双模连接的技术细节。研究发现,手机在连接双模耳机时优先通过BR/EDR配对,再利用CTKD派生BLE连接所需的密钥。关键条件包括:设备地址一致性、启用安全连接(Secure Connection)及禁用justworks配对方式。文章详细剖析了从BR/EDR链路密钥派生BLE长期密钥(LTK)的算法流程,重点解析了H6/H7加密函数的作用机制与安全差异。研究还通过HCI日志验证了密钥交换和加密建立的完整过程,指出蓝牙5.1版本对CTKD安全性的强

十多年蓝牙协议软件开发,擅长蓝牙协议分析 2697

RabbitMQ进阶教程三(整合springboot,延迟队列,发布确认高级,备份交换机)

RabbitMQ进阶教程三(整合springboot,延迟队列,发布确认高级,备份交换机)

qq_51269815的博客 743

【毕设级教程】从0到1实现基于YOLOv8的xView卫星图像目标检测系统(含UI界面,助力遥感智能毕设)

本文基于YOLOv8模型设计了一个面向xView卫星图像的目标检测系统。首先对xView数据集进行了格式转换处理,将原始多边形标注转换为YOLO格式的边界框标注。随后通过配置YOLOv8模型参数完成训练,实现了对卫星图像中建筑、车辆等多类目标的准确识别。为提高系统交互性,采用PyQt开发了可视化界面,支持图像选择、实时检测和结果展示功能。整个系统兼顾学术价值和实用价值,为遥感领域的自动化目标检测提供了可行方案。

m0_64661770的博客 130

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

消息队列高级实战:RabbitMQ的死信队列、延迟队列与发布确认的深度剖析!

本文将深入探讨RabbitMQ的高级特性,包括交换机的多种类型、死信队列、延迟队列以及发布确认机制等。通过实战案例,带你从理论到实践,全面掌握RabbitMQ的高级应用,助力你在消息中间件领域更进一步。

qq_51749909的博客 277

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Rabbitmq学习

1.轮询操作 工作队列(又称任务队列)的主要思想是避免立即执行资源密集型任务,而不得不等待它完成。 相反我们安排任务在之后执行。我们把任务封装为消息并将其发送到队列。在后台运行的工作进 程将弹出任务并最终执行作业。当有多个工作线程时,这些工作线程将一起处理这些任务。 1.1轮训分发消息 ​ 设置代码如下所示 创造消息队列,并且发送消息 public class Task01 { public static final String QUEUE_NAME = "hello"; .

WC949464367的博客 1362

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

RabbitMQ学习笔记(下):延迟队列,发布确认高级,备份交换机

点击启动类重新启动,在网页端输入:localhost:8080/ttl/sendExpirationMsg/你好1/20000和localhost:8080/ttl/sendExpirationMsg/你好2/2000。rabbitmq的插件在:/usr/lib/rabbitmq/lib/rabbitmq_server-3.8.8/plugins目录下,上传插件到目录下,如果上传失败用sudo rz先获得权限。问题:延迟队列是排队的,当队列中有多条消息时,延迟队列的消息会根据前面最长时间发送。

RuanFun的博客 469

SpringBoot整合RabbitMq企业级使用封装

SpringBoot整合RabbitMq企业级使用封装 1、RabbitMq基础说明 2、SpringBoot整合RabbitMq,以及RabbitMq的封装和高级用法 2.1、pom.xml 2.2、application.yml 2.3、Mq配置类MessageQueueConfiguration 2.3.1、代码 2.3.2、设置replyTimeout 2.3.3、publisher-confirm-type和mandatory 2.4、自定义发送消息帮助类MessageQueueHelper

张刚的博客 1608

RabbitMQ官方文档知识点总结合集+代码注释(中文+Java版)

文章目录零、 RabbitMQ安装1. 在官网下载`rabbitmq-server`2. 在GitHub上下载`erlang`3. 将文件上传至你的服务器or虚拟机的`/usr/local/software`目录下4. 安装文件5. 常用命令6. 开启web管理插件一、快速开始 `Hello World`1.1 RabbitMQ 简介1.2 示例程序:Hello World1. 建立Java Maven工程,在`pom.xml`中添加以下配置2. 发送消息3. 接收消息4. 运行代码二、 工作队列/任务队列

CherryChenieth的博客 9465

springboot整合RabbitMQ

MQ yml配置:

weixin_38568503的博客 1613

RabbitMQ

RabbitMQ各个MQ介绍ActiveMQkafakRocketMQRabbitMQMQ的选择RabbitMQ四大核心概念原理名词解释 各个MQ介绍 ActiveMQ kafak RocketMQ RabbitMQ MQ的选择 RabbitMQ 四大核心概念 原理名词解释

weixin_43303455的博客 364

SpringBoot 整合 RabbitMQ

​ 保证消息不丢失,可靠抵达,可以使用事务机制,但是性能会下降250倍,为此可以引入确认机制。创建一个订单的延迟队列和普通队列并设置延迟队列的路由键,当消息过期以后路由到取消队列。外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传。外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传。向指定交换机和指定队列发送消息。创建监听器监听发来的消息。

clinch123的博客 999

java学习之RabbitMq

尚硅谷rabbitmq的学习笔记 包括老师讲的重点内容,以及一些个人的思考。

qq_28356977的博客 1347

RabbitMQ学习笔记

2007 年发布,是一个在 AMQP(高级消息队列协议)基础上完成的,可复用的企业消息系统,是当前最主流的消息中间件之一。延时队列在需要延时处理的场景下非常有用,使用 RabbitMQ 来实现延时队列可以很好的利用RabbitMQ 的特性,如:消息可靠发送、消息可靠投递、死信队列来保障消息至少被消费一次以及未被正确处理的消息不会被丢弃。另外,通过 RabbitMQ 集群的特性,可以很好的解决单点故障问题,不会因为单个节点挂掉导致延时队列不可用或者消息丢失。

小鲁蛋的博客 472

RabbitMQ_00000

RabbitMQ

wisdom 773
上一篇: oss实现文件上传和下载(前后端分离)
下一篇: install时报错Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default
甜城里的同学
博客等级 码龄5年 8粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值