mq延时队列使用

news2024/11/25 6:37:14

一、基本配置

  1. 导入依赖
        <!--高级消息队列协议amqp-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

  1. application.yml配置
  #rabbitmq
  rabbitmq:
    host: 192.168.56.10
    virtual-host: /
    port: 5672
  1. 启动类添加注解
@EnableRabbit
  1. 配置mq的json序列化
@Configuration
public class RabbitmqConfig {

    @Autowired
    RabbitTemplate rabbitTemplate;

    @Bean
    public MessageConverter RabbitmqConvertJSON(){
        return new Jackson2JsonMessageConverter();
    }


}

  1. 配置交换机、队列、绑定规则
	@Bean
    public Exchange StockEventExchange(){
        //TopicExchange(String name, boolean durable, boolean autoDelete, Map<String, Object> arguments)
        return new TopicExchange("stock-event-exchange",true,false);
    }

    @Bean
    public Queue StockReleaseStockQueue(){
        //Queue(String name, boolean durable, boolean exclusive, boolean autoDelete)
        return new Queue("stock.release.stock.queue",true,false,false);
    }

    @Bean
    public Queue StockDelayQueue(){
        Map<String,Object> map = new HashMap<>();
        //死信路由exchange
        map.put("x-dead-letter-exchange","stock-event-exchange");
        //死信routing-key
        map.put("x-dead-letter-routing-key","stock.release");
        //time to live
        map.put("x-message-ttl",60000);
        return new Queue("stock.delay.queue",true,false,false,map);
    }

    @Bean
    public Binding StockLocked(){
        //Binding(String destination, Binding.DestinationType destinationType, String exchange, String routingKey, Map<String, Object> arguments)
        return new Binding("stock.delay.queue", Binding.DestinationType.QUEUE,"stock-event-exchange","stock.locked",null);
    }

    @Bean
    public Binding StockRelease(){
        return new Binding("stock.release.stock.queue",Binding.DestinationType.QUEUE,"stock-event-exchange","stock.release.#",null);
    }
  1. 建立连接,即可在mq中生成交换机、队列、绑定规则
	@RabbitListener(queues = {"stock.release.stock.queue"})
    public void ListenQueue(Message message, Channel channel){

    }

二、订单服务使用mq

在这里插入图片描述
1.生成队列、交换机、绑定规则

/**
 * 如果设置错误需要删掉错误的Queue重启服务即可,重启服务不会覆盖原有的Queue
 */
@Configuration
public class MyMQConfig {

    @Bean
    public Queue OrderDelayQueue(){
        Map<String,Object> map = new HashMap<>();
        //死信路由
        map.put("x-dead-letter-exchange","order-event-exchange");
        //死信
        map.put("x-dead-letter-routing-key","order.release.order");
        //time to live
        map.put("x-message-ttl",30000);

        //持久化,排它
        //Queue(String name, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments)
        return new Queue("order.delay.order",true,false,false,map);
    }

    @Bean
    public Queue OrderReleaseOrderQueue(){
        return new Queue("order.release.order.queue",true,false,false,null);
    }

    //选用topic类型交换机是因为需要binding多个队列
    @Bean
    public Exchange OrderEventExchange(){
        //TopicExchange(String name, boolean durable, boolean autoDelete, Map<String, Object> arguments)
        return new TopicExchange("order-event-exchange",true,false,null);
    }

    @Bean
    public Binding OrderCreateOrder(){
        //Binding(String destination, Binding.DestinationType destinationType, String exchange, String routingKey, Map<String, Object> arguments)
        return new Binding("order.delay.order", Binding.DestinationType.QUEUE,"order-event-exchange","order.create.order",null);
    }

    @Bean
    public Binding OrderReleaseOrder(){
        return new Binding("order.release.order.queue", Binding.DestinationType.QUEUE,"order-event-exchange","order.release.order",null);
    }


}

2.生产者发送消息

@ResponseBody
    @GetMapping("/test/queue")
    public String testQueue(){
        OrderEntity orderEntity = new OrderEntity();
        orderEntity.setOrderSn(UUID.randomUUID().toString());
        //给队列发消息,指定routing key
        //convertAndSend(String exchange, String routingKey, Object object)
        rabbitTemplate.convertAndSend("order-event-exchange","order.create.order",orderEntity);
        return "给mq发消息完成";
    }

3.订阅队列

@RabbitListener(queues = {"order.release.order.queue"})
    public void ListenQueue(Channel channel, Message message, OrderEntity orderEntity) throws IOException {
        //因为配置了手动ack,所有这里需要签收消息
        //basicAck(long deliveryTag, boolean multiple)
        channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
        System.out.println("手动过期的订单信息,准备关闭订单:"+orderEntity.getOrderSn());
    }

三、库存服务使用mq

在这里插入图片描述

@Configuration
public class RabbitmqConfig {

    @Autowired
    RabbitTemplate rabbitTemplate;

    @RabbitListener(queues = {"stock.release.stock.queue"})
    public void ListenQueue(Message message, Channel channel){

    }

    /**
     * json序列化
     */
    @Bean
    public MessageConverter RabbitmqConvertJSON(){
        return new Jackson2JsonMessageConverter();
    }

    @Bean
    public Exchange StockEventExchange(){
        //TopicExchange(String name, boolean durable, boolean autoDelete, Map<String, Object> arguments)
        return new TopicExchange("stock-event-exchange",true,false);
    }

    @Bean
    public Queue StockReleaseStockQueue(){
        //Queue(String name, boolean durable, boolean exclusive, boolean autoDelete)
        return new Queue("stock.release.stock.queue",true,false,false);
    }

    @Bean
    public Queue StockDelayQueue(){
        Map<String,Object> map = new HashMap<>();
        //死信路由exchange
        map.put("x-dead-letter-exchange","stock-event-exchange");
        //死信routing-key
        map.put("x-dead-letter-routing-key","stock.release");
        //time to live
        map.put("x-message-ttl",60000);
        return new Queue("stock.delay.queue",true,false,false,map);
    }

    @Bean
    public Binding StockLocked(){
        //Binding(String destination, Binding.DestinationType destinationType, String exchange, String routingKey, Map<String, Object> arguments)
        return new Binding("stock.delay.queue", Binding.DestinationType.QUEUE,"stock-event-exchange","stock.locked",null);
    }

    @Bean
    public Binding StockRelease(){
        return new Binding("stock.release.stock.queue",Binding.DestinationType.QUEUE,"stock-event-exchange","stock.release.#",null);
    }

}

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

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

相关文章

02 半同步半反应堆线程池

服务器编程基本框架 主要由I/O单元&#xff0c;逻辑单元和网络存储单元组成&#xff0c;其中每个单元之间通过请求队列进行通信&#xff0c;从而协同完成任务。 其中I/O单元用于处理客户端连接&#xff0c;读写网络数据&#xff1b;逻辑单元用于处理业务逻辑的线程&#xff1b…

ES7~ES13新特性(二)

1 ES7新增特性解析 2 ES8新增特性解析 3 ES10新增特性解析 4 ES11新增特性解析 5 ES12新增特性解析 6 ES13新增特性解析 ES8-对象相关的属性 ---entries的使用 const obj {name: "why",age: 18,height: 1.88,address: "广州市"}// 1.获取所有的keyco…

【NLP】Transformer模型原理(2)

接上文 【NLP】Transformer模型原理(1) 六、零层的transformer 观看涵盖与本节类似内容的视频:0 层理论 在进入更复杂的模型之前,简要考虑一下“零层”变压器很有用。这样的模型获取一个令牌,嵌入它,解嵌它以生成预测下一个令牌的对数: ​

音频数据分割单独处理后再拼接出现跳跃间断点的处理方法

+hezkz17进数字音频系统研究开发交流答疑 1如图所示 问题1: 对于一个81920字节的音频文件,如果是分割成小块4096输入(无重叠,均分),在频域上做去噪算法,每4k数据返回到时域上再拼接成80k的处理结果文件,发现处理结果有异常有跳跃间断点,像是频谱泄露?分割也需要有重…

mysql函数练习

创建表sch 向表中加入数据 1、创建一个可以统计表格内记录条数的存储函数 &#xff0c;函数名为count_sch() CREATE DEFINERroot% FUNCTION count_sch() RETURNS int(11) BEGINDECLARE total INT DEFAULT 0;#Routine body goes here...SELECT count(1) into total from sch;IN…

Linux->初识计算机网络

目录 前言&#xff1a; 1 网络发展背景 2 协议 2.1 网络协议初识 2.2 协议分层 2.3 OSI、TCP/IP层状模型 2.4 协议和操作系统的关系 2.5 根据协议栈的通信 3 网络中的地址管理 前言&#xff1a; 本篇当中没有任何关于网络编程的讲解&#xff0c;全部是对网络的宏观理解…

Go语言github.com/gorilla/websocket框架websocket协议通信实战

websocket是实际开发中比较常用的应用层协议&#xff0c;本文利用github.com/gorilla/websocket框架进行websocket通信实战。 目录 1.下载github.com/gorilla/websocket 2.websocket服务端 3.websocket Go客户端 4.websocket 网页客户端 5.运行结果展示 1.下载github.com…

【UI自动化测试】appium+python+unittest+HTMLRunner

进阶Python接口自动化测试必备教程&#xff08;2023全网最详细&#xff09; 简介 获取AppPackage和AppActivity 定位UI控件的工具 脚本结构 PageObject分层管理 HTMLTestRunner生成测试报告 启动appium server服务 以python文件模式执行脚本生成测试报告 下载与安装 下载需要自…

深度学习(28)——YOLO系列(7)

深度学习&#xff08;28&#xff09;——YOLO系列&#xff08;7&#xff09; 咱就是说&#xff0c;需要源码请造访&#xff1a;Jane的GitHub&#xff1a;在这里 上午没写完的&#xff0c;下午继续&#xff0c;是一个小尾巴。其实上午把训练的关键部分和数据的关键部分都写完了…

macOS 怎么安装redis数据库

1 访问redis数据库下载网址 http://download.redis.io/releases/ 访问上述的redis下载的网址&#xff0c;确定你想要的版本 然后下载即可 &#xff08;我选则的是6.2.6&#xff09; 然后下载 下载后 把这个文件解压&#xff0c;放在自己想要放在的位置 2 打开终端 输入对应的…

Hadoop 单机部署和测试(一)

Hadoop单机部署和测试 一.单机部署1.安装 JDK&#xff08;JDK11&#xff09;2.安装 HADOOP3.测试 一.单机部署 系统版本&#xff1a;cat /etc/anolis-release1.安装 JDK&#xff08;JDK11&#xff09; #!/bin/bashTOP_PATH$(pwd) JAVA_PATH/usr/local/java FILEls $TOP_PATH/…

本地部署 Stable Diffusion XL Gradio Demo WebUI

StableDiffusion XL Gradio Demo WebUI 0. 先展示几张 StableDiffusion XL 生成的图片1. 什么是 Stable Diffusion XL Gradio Demo WebUI2. Github 地址3. 安装 Miniconda34. 创建虚拟环境5. 安装 Stable Diffusion XL Gradio Demo WebUI6. 启动 Stable Diffusion XL Gradio De…

【LeetCode周赛】2022上半年题目精选集——动态规划

文章目录 2140. 解决智力问题解法1——倒序DP&#xff08;填表法&#xff09;解法2——正序DP&#xff08;刷表法&#xff09;⭐⭐⭐ 2167. 移除所有载有违禁货物车厢所需的最少时间⭐⭐⭐解法1——前缀和⭐⭐⭐⭐⭐解法2——前后缀分解 动态规划代码1——看了思路之后自己写的…

java中json和对象之间相互转换的运用

1.目录结构 2.配置相关文件 2.1.引入相关的pom文件 pom.xml <dependencies><!-- JSON --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.12.3</vers…

linux 基于debian_ubuntu AB系统适配(三)- overlayroot

Overlayroot Overlayroot是一个实用工具,允许您创建一个只读的根文件系统和一个可写的覆盖文件系统。这对于创建一个更安全和稳定的系统很有用,因为对系统所做的任何更改都将存储在覆盖文件系统中,可以很容易地丢弃或重置。 在Debian下,分离的系统在/userdata/rootfs_ove…

浅谈OS命令注入漏洞(Shell注入漏洞)

一、什么是OS命令注入&#xff1f; 1. 基本概念 OS&#xff08;Operating system&#xff09;命令注入&#xff08;也称为 Shell 注入&#xff09;是一个 Web 安全漏洞&#xff0c;允许攻击者在运行应用程序的服务器上执行任意操作系统 &#xff08;OS&#xff09; 命令&#…

考虑充电负荷空间可调度特性的分布式电源与电动汽车充电站联合配置方法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

DaVinci Resolve Studio 18对Mac和Windows系统的要求

DaVinci Resolve Studio 18 是一款功能强大的专业视频编辑和调色软件&#xff0c;它提供了全面的工具和功能&#xff0c;让用户能够完成从剪辑、调色到特效和音频处理等各个方面的任务。DaVinci Resolve Studio 18 在中文界面上进行了优化&#xff0c;使得中文用户能够更加方便…

【xxl-job】分布式任务调度系统xxl-job搭建

XXL-JOB是一个轻量级分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展、开箱即用。 更多介绍&#xff0c;请访问官网&#xff1a;分布式任务调度平台XXL-JOB 一、任务调度中心(基于docker)【Version 2.4.0】 前提条件&#xff1a;任务调度…

Vue3 Vite electron 开发桌面程序

Electron是一个跨平台的桌面应用程序开发框架&#xff0c;它允许开发人员使用Web技术&#xff08;如HTML、CSS和JavaScript&#xff09;构建桌面应用程序&#xff0c;这些应用程序可以在Windows、macOS和Linux等操作系统上运行。 Electron的核心是Chromium浏览器内核和Node.js…