首页 > 其他分享 >118、商城业务---分布式事务---RabbitMQ延时队列定时关单模拟

118、商城业务---分布式事务---RabbitMQ延时队列定时关单模拟

时间:2023-02-23 19:11:19浏览次数:32  
标签:String exchange 队列 关单 --- 交换机 RabbitMQ order arguments

1、使用RabbitMq实现延时队列方法1

2、基于我们的业务我们使用下面这种方式实现延时队列

1、导入依赖

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

2、编写rabbitmq的相关配置

2、编写配置类来创建队列、交换机、绑定关系

package com.gulimall.order.config;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.Exchange;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

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

/**
 * 使用配置类快速创建交换机、队列、绑定关系
 */
@Configuration
public class MyRabbitMqConfig {
    /**
     * @Bean的作用是自动给rabbitmq创建我们的交换机、队列、绑定关系
     * @return
     */

    /**
     * 监听我们的死信队列 【由于我们在配置文件中设置了手动ack消息,所以我们在这里通过Chnnel来接受消息】
     * @return
     */
    @RabbitListener(queues = "order.release.order.queue")
    public void listener(OrderEntity order, Channel channel, Message message) throws IOException {
        String orderSn = order.getOrderSn();
        System.out.println("收到过期消息:" + orderSn);
        channel.basicAck(message.getMessageProperties().getDeliveryTag(), false); //手动确认消息
    }

    //一个交换机
    @Bean
    public Exchange orderEventExchange(){
        /**
         * 对于只有一个交换机的设计,我们一般创建一个topic交换机
         * (String name, boolean durable, boolean autoDelete, Map<String, Object> arguments
         */
        return new TopicExchange("order-event-exchange", true, false);
    }

    //死信队列
    @Bean
    public Queue orderDelayQueue(){
        /**
         * 配置参数
         * x-dead-letter-exchange: order-event-exchange
         * x-dead-letter-routing-key: order.release.order
         * x-message-ttl: 60000
         */
        Map<String, Object> arguments = new HashMap<>();
        arguments.put("x-dead-letter-exchange", "order-event-exchange");//死信路由到order-event-exchange交换机
        arguments.put("x-dead-letter-routing-key", "order.release.order");//死信路由键
        arguments.put("x-message-ttl", 60000);//消息过期时间

        /**
         * String name, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments
         */
        Queue queue = new Queue("order.delay.queue", true, false, false, arguments);
        return queue;
    }

    //普通队列
    @Bean
    public Queue orderReleaseOrderQueue(){
        /**
         * String name, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments
         */
        Queue queue = new Queue("order.release.order.queue", true, false, false);
        return queue;
    }

    //交换机绑定队列
    @Bean
    public Binding orderCreateOrderBinding(){
        /**
         * String destination, DestinationType destinationType, String exchange, String routingKey, Map<String, Object> arguments
         */
        return new Binding("order.delay.queue", Binding.DestinationType.QUEUE, "order-event-exchange", "order.create.order", null);
    }


    //交换机绑定队列
    @Bean
    public Binding orderReleaseOrderBinding(){
        /**
         * String destination, DestinationType destinationType, String exchange, String routingKey, Map<String, Object> arguments
         */
        return new Binding("order.release.order.queue", Binding.DestinationType.QUEUE, "order-event-exchange", "order.release.order", null);
    }
}

重启项目后,如果发现rabbitmq官网上面没有自动给我们创建交换机和队列,我们只需要给rabbitmq发送一个请求即可自动创建,我的请求如下

标签:String,exchange,队列,关单,---,交换机,RabbitMQ,order,arguments
From: https://www.cnblogs.com/morehair/p/17149107.html

相关文章

  • 05. Kubernetes - 集群安装(二进制)
    安装准备区别于使用kubeadm部署集群时所有核心组件都托管在集群上。二进制安装则采用守护进程的方式直接将各个组件运行在宿主机,生产环境更为推荐。服务还是那些,只需要......
  • 大数据技术-hadoop
    hadoop是什么Hadoop是一个由Apache基金会所开发的分布式系统基础架构。主要解决,海量数据的存储和海量数据的分析计算问题。广义上来说,Hadoop通常是指一个更广泛的概......
  • uni-app:微信小程序中用户登录(hbuilderx 3.6.18)
    一,代码:说明:xcxuserinfo是服务端得到用户信息的接口,我们用code作为参数传递给服务端,由服务端得到openid再得到用户信息然后返回<template><view><button......
  • HBase--分布式列存储NOSQL数据库
        HBase本质上是一个数据模型,可以提供快速随机访问海量结构化数据。利用Hadoop的文件系统(HDFS)提供的容错能力。它是Hadoop的生态系统,使用HBase在HDFS......
  • 决战圣地玛丽乔亚Day19---
    聚簇索引和非聚簇索引:聚簇和非聚簇的含义是:是否索引和数据进行绑定,即是否需要二次查找才能找到对应的数据值。由于聚簇索引的绑定关系,要求聚簇索引是唯一值,否则不能明确通......
  • CF845G - Shortest Path Problem?
    题意:求带边权无向图上\(1\)到\(n\)的异或最短路,可以重复经过某条边。首先,我们考虑从\(x\)到\(y\)的路径\(A\),它的权值是\(a\)。我们从路径中途的某个地方离开路......
  • CF845F - Guards In The Storehouse
    题意:在\((x,y)\)放一个哨兵,可以监视本行后面的所有格子直到障碍、本列后面所有的格子直到障碍。求使全盘最多一个位置不被监视的方案总数。我们发现,因为\(nm\le250\),......
  • 随便玩玩之C# 9 程序控制-循环for
    随便玩玩之C#9程序控制-循环for循环是程序设计语言中反复执行某些代码的一种计算机处理过程。也有人叫迭代。迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或......
  • RabbitMQ 总结
    为什么使用MQ:异步,解耦,肖峰使用消息队列带来的一些问题:系统可用性降低:系统可用性在某种程度上降低,为什么这样说呢?在加入MQ之前,你不用考虑      消息丢失......
  • 记录--前端项目中运行 npm run xxx 的时候发生了什么?
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助npm是node捆绑的依赖管理器,常用程度可想而知。那么你每天都在npm/yarnrun的命令到底是如何运行项目......