sringboot整合rabbitmq

2023-11-08

一、基本概念

生产者(Producer)
产生数据发送消息的程序是生产者

交换机(Exchangs)
交换机是 RabbitMQ 非常重要的一个部件,一方面它接收来自生产者的消息,另一方面它将消息推送到队列中。交换机必须确切知道如何处理它接收到的消息,是将这些消息推送到特定队列还是推送到多个队列,亦或者是把消息丢弃,这个得有交换机类型决定

队列(Queue)
队列是 RabbitMQ 内部使用的一种数据结构,尽管消息流经 RabbitMQ 和应用程序,但它们只能存储在队列中。队列仅受主机的内存和磁盘限制的约束,本质上是一个大的消息缓冲区。许多生产者可以将消息发送到一个队列,许多消费者可以尝试从一个队列接收数据。这就是我们使用队列的方式

消费者(Consumer)
消费与接收具有相似的含义。消费者大多时候是一个等待接收消息的程序。请注意生产者,消费者和消息中间件很多时候并不在同一机器上。同一个应用程序既可以是生产者又是可以是消费者。

二、使用场景

1.电商的收货后15天自动确认收货
2.电商未付款的1小时自动取消订单
3.通过mq进行解耦合
4.通过mq缓解主进程压力

三、mq结合springboot

1.项目配置

yaml文件配置
  # rabbitmq配置
  rabbitmq:
    host: 101.101.101.101 ## mq的ip地址
    port: 5672  ## 端口号
    username: cs  ## 用户名
    password: cs  ## 密码
    virtual-host: cs-cs   ## 连接的库

web的访问地址为 :101.101.101.101:15672(你的mq必须配置了mq可视化的插件)

2.mq队列的注册和绑定

1.延迟队列

@Configuration
public class delayConfig {
   /**
     * 延时队列交换机
     */
    public static final String EXCHANG_DELAY = "exchang.delay";
    /**
      * 自动取消订单队列
      */
    public static final String QUEUE_CLOSE = "queue.close";
    /**
     * 自动取消订单 绑定路由
     */
    public static final String KEY_CLOSE = "key.close";
    
   /**
     * 创建延时队列交换机
     */
    @Bean(EXCHANG_DELAY)
    public Exchange delayExchage() {
        return ExchangeBuilder
                .topicExchange(EXCHANG_DELAY)
                .durable(true)
                .delayed()   // 开启延迟消息
                .build();
    }

    /**
     * 创建订单自动关闭QUEUE
     */
    @Bean(QUEUE_CLOSE)
    public Queue createCloseQueue() {
        return new Queue(QUEUE_CLOSE, true);
    }

    /**
     * 创建订单自动关闭的BingdingKey
     */
    @Bean(KEY_CLOSE)
    public Binding bindCloseOrderKey() {
        return BindingBuilder
                .bind(createCloseQueue()) //绑定队列
                .to(delayExchage())  //绑定延迟交换机
                .with(KEY_CLOSE)  //绑定路由
                .noargs();
    }
}

如果你想只是用这一个交换机,那你可以按照上面继续新建队列和路由,直接进行绑定就可以了,不需要构建多个延迟交换机。
2.不延迟队列

@Configuration
public class DirectConfig {

    /**
     * 不延迟交换机
     */
    public static final String DIRECT_EXCHANGE = "direct.exchange";

    /**
     * 队列
     */
    public static final String DIRECT_QUEUE = "direct.queue";
    /**
     *  路由
     */
    public static final String DIRECT_KEY = "direct.key";

    /**
     * 创建订单延时队列交换机
     */
    @Bean(DIRECT_EXCHANGE)
    public Exchange directExchange() {
        return ExchangeBuilder
                .directExchange(DIRECT_EXCHANGE) // 队列方式
                .durable(true)
                .build();
    }

    /**
     * 新建队列
     */
    @Bean(DIRECT_QUEUE)
    public Queue createQueue() {
        return new Queue(DIRECT_QUEUE, true);
    }

    /**
     * 队列和路由进行绑定交换机
     */
    @Bean(DIRECT_KEY)
    public Binding bindWithdrawKey() {
        return BindingBuilder
                .bind(createQueue())
                .to(directExchange())
                .with(DIRECT_KEY)
                .noargs();
    }
}

3.构建生产者

    /**
     * 自动确认收货(平台发货15后自动确认收货)
     * 应该运营后台调用这个接口
     *
     * @param orderId 订单id
     */
    void autoClose(Long orderId);


// 首先是serivice的实现类,现在要实现这个方法
    /**
     * 自动确认收货
     *
     * @param orderId 订单id
     */
    @Override
    public void autoClose(Long orderId) {
        log.info("延时确认收货队列发送成功, 订单编号:{}", orderId);
        // 15天
        int delay = 15 * 60 * 60 * 1000;
        MessagePostProcessor processor = buildProcessor(delay);//构建延迟时间
        rabbitTemplate.convertAndSend( // 绑定交换机通过路由key去发送消息到对应的队列中
                OrderDelayConfig.EXCHANG_DELAY,
                OrderDelayConfig.KEY_CLOSE,
                orderId,
                processor
        );
    }

    /**
     * 构建 MessagePostProcessor
     *
     * @param delayTime 延时时间
     */
    private MessagePostProcessor buildProcessor(int delayTime) {

        return message -> {
            // 设置消息持久化
            message.getMessageProperties().setDeliveryMode(MessageDeliveryMode.PERSISTENT);
            message.getMessageProperties().setDelay(delayTime);
            return message;
        };
    }


///如果不需要发送和延迟消息,就不需要传这个延迟时间,其余的都是一样的

4.构建消费者


@Component
@RequiredArgsConstructor
@Slf4j
public class RabbitMQConsumer {

    private final OrderService orderService;

    /**
     * 订单自动关闭
     *
     * @param orderId 订单id
     */
    @RabbitListener(queues = delayConfig.QUEUE_CLOSE) //绑定队列
        public void closeOrder(Long orderId) {
        log.info("--------------订单:{} 自动关闭--------------", orderId);
        orderService.autoDuleClose(orderId); //调用自己定义的方法进行处理
    }
    
    //这里的autoDuleClose()就是你自己的业务层处理的方法,注意:mq里面不要抛出异常;
    //一定不要抛异常,出现问题需要用log.error()打印出来


}

至此就简单的实现了mq的应用,如果你需要深入了解,请自己主动的深入查询了解。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

sringboot整合rabbitmq 的相关文章

  • 不同帐户上的 Spring Boot、JmsListener 和 SQS 队列

    我正在尝试开发一个 Spring Boot 1 5 应用程序 该应用程序需要侦听来自两个不同 AWS 帐户的 SQS 队列 是否可以使用 JmsListener 注解创建监听器 我已检查权限是否正确 我可以使用 getQueueUrl 获取
  • 在内存中使用 byte[] 创建 zip 文件。 Zip 文件总是损坏

    我创建的 zip 文件有问题 我正在使用 Java 7 我尝试从字节数组创建一个 zip 文件 其中包含两个或多个 Excel 文件 应用程序始终完成 没有任何异常 所以 我以为一切都好 当我尝试打开 zip 文件后 Windows 7 出
  • Java 枚举与创建位掩码和检查权限的混淆

    我想将此 c 权限模块移植到 java 但是当我无法将数值保存在数据库中然后将其转换为枚举表示形式时 我很困惑如何执行此操作 在 C 中 我创建一个如下所示的枚举 public enum ArticlePermission CanRead
  • 如何循环遍历所有组合,例如48 选择 5 [重复]

    这个问题在这里已经有答案了 可能的重复 如何在java中从大小为n的集合中迭代生成k个元素子集 https stackoverflow com questions 4504974 how to iteratively generate k
  • 使用 LinkedList 实现下一个和上一个按钮

    这可能是一个愚蠢的问题 但我很难思考清楚 我编写了一个使用 LinkedList 来移动加载的 MIDI 乐器的方法 我想制作一个下一个和一个上一个按钮 以便每次单击该按钮时都会遍历 LinkedList 如果我硬编码itr next or
  • Spring AspectJ 在双代理接口时失败:无法生成类的 CGLIB 子类

    我正在使用Spring的
  • HSQL - 识别打开连接的数量

    我正在使用嵌入式 HSQL 数据库服务器 有什么方法可以识别活动打开连接的数量吗 Yes SELECT COUNT FROM INFORMATION SCHEMA SYSTEM SESSIONS
  • 如何更改javaFX中按钮的图像?

    我正在使用javaFX 我制作了一个按钮并为此设置了图像 代码是 Image playI new Image file c Users Farhad Desktop icons play2 jpg ImageView iv1 new Ima
  • 没有 Spring 的自定义 Prometheus 指标

    我需要为 Web 应用程序提供自定义指标 问题是我不能使用 Spring 但我必须使用 jax rs 端点 要求非常简单 想象一下 您有一个包含键值对的映射 其中键是指标名称 值是一个简单的整数 它是一个计数器 代码会是这样的 public
  • 无法创建请求的服务[org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]-MySQL

    我是 Hibernate 的新手 我目前正在使用 Spring boot 框架并尝试通过 hibernate 创建数据库表 我知道以前也问过同样的问题 但我似乎无法根据我的环境找出如何修复错误 休眠配置文件
  • 帮助将图像从 Servlet 获取到 JSP 页面 [重复]

    这个问题在这里已经有答案了 我目前必须生成一个显示字符串文本的图像 我需要在 Servlet 上制作此图像 然后以某种方式将图像传递到 JSP 页面 以便它可以显示它 我试图避免保存图像 而是以某种方式将图像流式传输到 JSP 自从我开始寻
  • Hibernate 的 PersistentSet 不使用 hashCode/equals 的自定义实现

    所以我有一本实体书 public class Book private String id private String name private String description private Image coverImage pr
  • Eclipse 选项卡宽度不变

    我浏览了一些与此相关的帖子 但它们似乎并不能帮助我解决我的问题 我有一个项目 其中 java 文件以 2 个空格的宽度缩进 我想将所有内容更改为 4 空格宽度 我尝试了 正确的缩进 选项 但当我将几行修改为 4 空格缩进时 它只是将所有内容
  • 使用 AsyncTask 传递值

    我一直在努力解决这个问题 但我已经到了不知道该怎么办的地步 我想做的是使用一个类下载文件并将其解析为字符串 然后将该字符串发送到另一个类来解析 JSON 内容 所有部件都可以单独工作 并且我已经单独测试了所有部件 我只是不知道如何将值发送到
  • 如何使用 jUnit 将测试用例添加到套件中?

    我有 2 个测试类 都扩展了TestCase 每个类都包含一堆针对我的程序运行的单独测试 如何将这两个类 以及它们拥有的所有测试 作为同一套件的一部分执行 我正在使用 jUnit 4 8 在 jUnit4 中你有这样的东西 RunWith
  • Cucumber 0.4.3 (cuke4duke) 与 java + maven gem 问题

    我最近开始为 Cucumber 安装一个示例项目 并尝试使用 maven java 运行它 我遵循了这个指南 http www goodercode com wp using cucumber tests with maven and ja
  • 我如何在java中读取二进制数据文件

    因此 我正在为学校做一个项目 我需要读取二进制数据文件并使用它来生成角色的统计数据 例如力量和智慧 它的设置是让前 8 位组成一个统计数据 我想知道执行此操作的实际语法是什么 是不是就像读文本文件一样 这样 File file new Fi
  • 干净构建 Java 命令行

    我正在使用命令行编译使用 eclipse 编写的项目 如下所示 javac file java 然后运行 java file args here 我将如何运行干净的构建或编译 每当我重新编译时 除非删除所有内容 否则更改不会受到影响 cla
  • 使用反射覆盖最终静态字段是否有限制?

    在我的一些单元测试中 我在最终静态字段上的反射中遇到了奇怪的行为 下面是说明我的问题的示例 我有一个基本的 Singleton 类 其中包含一个 Integer public class BasicHolder private static
  • 在java中为组合框分配键

    我想添加一个JComboBox在 Swing 中这很简单 但我想为组合中的每个项目分配值 我有以下代码 JComboBox jc1 new JComboBox jc1 addItem a jc1 addItem b jc1 addItem

随机推荐

  • 刷脸支付无一例外地建构与完善起来

    刷脸支付均采用的是3D人脸识别技术 这种技术具有一项至关重要的功能 活体检测 即系统摄像头在识别人脸是否为本人的同时 还能检验是否有人利用照片等手段冒充用户 由此封闭了假体攻击的空间 正如支付工具的迭代总是高出人们的预估一样 技术的进化对于
  • 小程序配置网络请求@escook/request-miniprogram

    由于平台限制 小程序项目不支持axios 原生wx request API功能较为简单 不支持拦截器等功能 所以使用 escook request miniprogram第三方包发起网络数据请求 配置步骤 官方文档 https www np
  • 浅谈.NET语言开发应用领域

    NET语言是一种跨平台的开发框架 适用于各种应用程序的开发 以下是一些常见的 NET语言开发应用领域 桌面应用程序开发 使用 NET框架开发的桌面应用程序可以在Windows操作系统上运行 包括Windows Forms和WPF 这些应用程
  • 智能指针之weak_ptr06

    一 weak ptr 看名字就知道 他是一个弱引用 他的存在是为了辅助shared ptr的循环引用问题 它不占用引用数 只能通过shared ptr或者weak ptr构造赋值 它没有重载 和 gt 运算符 因此不可以直接通过 weak
  • hvv 文件上传和文件包含考点

    天眼如何判断文件上传漏洞是否成功 数据包分析 观察客户端请求数据 是否包含webshell流量特征 观察服务器返回信息 是否有 上传成功 或 success upload 等信息提示 尝试寻找上传的文件 访问上传的文件看是否存在 查看文件上
  • Java的数据类型及变量

    一 变量 内存存储的是运行中程序的数据 eg 我有10块钱 买早餐花了6元 问我现在还有多钱 计算机 1 存储数据 2 CPU取出来 参与运算 3 结果更新内存 变量的本质 内存中的一个存储空间 另一种说法 程序运行过程中 其值可以发生改变
  • Java定时任务技术分析

    从零打造项目 系列文章 工具 比MyBatis Generator更强大的代码生成器 ORM框架选型 SpringBoot项目基础设施搭建 SpringBoot集成Mybatis项目实操 SpringBoot集成MybatisPlus项目实
  • 商汤提出解偶检测中分类和定位分支的新方法TSD,COCO 51.2mAP

    目前很多研究表明目标检测中的分类分支和定位分支存在较大的偏差 论文从sibling head改造入手 跳出常规的优化方向 提出TSD方法解决混合任务带来的内在冲突 从主干的proposal中学习不同的task aware proposal
  • IPD简介

    目录 IPD是什么 IPD流程 做正确的事 1 市场调研 2 需求管理 正确地做事 第一阶段 概念阶段 第二阶段 计划阶段 第三阶段 开发阶段 第四阶段 验证阶段 第五阶段 发布阶段 第六阶段 生命周期阶段 IPD与项目管理 项目管理 IP
  • 全程软件测试(十三):静态百盒测试-代码检查/走查——读书笔记

    代码检查与走查是人工测试的两种主要方式 本次主要介绍两种方式的相似点 不同点将在后面详细介绍 两种方式的相似点如下 1 二者均需要建立小组来研读特定程序 使用这两种方式的参与者都需要完成准备工作 准备工作是参加 头脑风暴 会议 会议的主旨是
  • uni-app 环境配置,uni.request封装,接口配置,全局配置,接口调用的封装

    1 环境配置 可参考uni 官网的环境配置 common文件夹下新建config js let url config if process env NODE ENV development 开发环境 url config https com
  • Mybatis-Plus高级查询LambdaQueryWrapper&QueryWrapper

    目录 前言 Wrapper 查询构造器 查询条件 前期准备 查询条件 allEq eq ne gt ge lt le between notBetween like notLike likeLeft likeRight isNull 空值查
  • Python3 使用psycopg2模块 批量写入数据到PostgreSQL数据库(最强输出速度,单机数据库3000W数据写入最多180秒)

    Python3 使用psycopg2模块 批量写入数据到PostgreSQL数据库 最强输出速度 单机数据库3000W数据写入最多180秒 1 本文知识点 1 将string或者list类型的数据转换为IO缓冲区中的str类型 指定格式 2
  • C++中对象创建与释放

    创建对象有以下四种形式 include
  • 一毛一条的接码平台_搭建一套基于 Groovy 规则引擎的业务风控平台

    黑灰产在互联网领域盛行 从反面推动了业务安全反欺诈领域的快速发展 互联网SAAS服务产品响应市场不断创新 也决定了业务风险的多样性 笔者所在财税领域常见的非财税业务互联网风控场景包括登陆注册 短信接口 营销活动 渠道引流推广 交易和支付等
  • 程序员如何逆袭,达到财富自由?

    程序员逆袭达到财富自由有以下几条路 1 加入独角兽公司 拿到大量期权 并坚守到上市套现 2 找到靠谱的创业公司和诚信的创始人 拿到百分比左右的股份 坚守到出售或者上市 3 通过技术创业 公司出售或者上市 4 建立影响力 通过技术咨询 自媒体
  • 目标检测中的MAP(无抄袭)

    个人理解 如果写的有问题可以留言交流 转载请标明出处 谢谢 参考链接 内含代码 https github com rafaelpadilla Object Detection Metrics 人家写的比我好 我只是用中文把理论小总结一下 懒
  • Transformer综述1——《A Survey on Visual Transformer》

    A Survey on Visual Transformer 摘要 将视觉Transformer应用到不同的任务中 分析优缺点 回顾自注意力机制 背景介绍 多层感知和全连接层是经典的神经网络 有多线性层和非线性激活函数 卷积神经网络引入卷积
  • STM32外设系列—DHT11

    本文程序暂时存在问题 显示的温湿度不正确 如有急需 可私信 文章标题 一 DHT11简介 二 数据手册分析 2 1 接口说明 2 2 串行通信说明 2 2 1 单总线通信 2 2 2 单总线传输数据位定义 2 2 3 时序图 三 DHT11
  • sringboot整合rabbitmq

    一 基本概念 生产者 Producer 产生数据发送消息的程序是生产者 交换机 Exchangs 交换机是 RabbitMQ 非常重要的一个部件 一方面它接收来自生产者的消息 另一方面它将消息推送到队列中 交换机必须确切知道如何处理它接收到