使用RabbitMQ实现延时消息自动取消的简单案例

这篇具有很好参考价值的文章主要介绍了使用RabbitMQ实现延时消息自动取消的简单案例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、流程图

使用RabbitMQ实现延时消息自动取消的简单案例,中间件,RabbitMQ,Java,Spring,SpringBoot,中间件,SpringMVC文章来源地址https://www.toymoban.com/news/detail-841675.html

二、导包

<!--消息队列 AMQP依赖,包含RabbitMQ-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

三、配置文件

#消息队列
spring:
  rabbitmq:
    host: 192.168.88.130
    port: 5672
    virtual-host: my_vhost #使用的虚拟主机
    username: root
    password: root
    listener:
      simple:
        acknowledge-mode: manual #开启手动应答

四、配置类

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 ORDER_EXCHANGE = "order_exchange";
    /**
     * 订单队列
     */
    public static final String ORDER_QUEUE = "order_queue";
    /**
     * 订单路由键
     */
    public static final String ORDER_ROUTING = "order_routing";
    /**
     * 死信交换机
     */
    public static final String ORDER_DEAD_EXCHANGE = "order_dead_exchange";
    /**
     * 死信队列
     */
    public static final String ORDER_DEAD_QUEUE = "order_dead_queue";
    /**
     * 死信路由键
     */
    public static final String ORDER_DEAD_ROUTING = "order_dead_routing";

    /**
     * 订单交换机
     */
    @Bean("orderExchange")
    public Exchange getOrderExchange() {
        return new DirectExchange(ORDER_EXCHANGE);
    }

    /**
     * 订单队列
     */
    @Bean("orderQueue")
    public Queue getOrderQueue() {
        Map<String, Object> map = new HashMap<>(3);
        map.put("x-dead-letter-exchange", ORDER_DEAD_EXCHANGE);//死信交换机
        map.put("x-dead-letter-routing-key", ORDER_DEAD_ROUTING);//死信路由键
        map.put("x-message-ttl", 1000 * 60 * 15);//队列过期时间
        return QueueBuilder
                .durable(ORDER_QUEUE)
                .withArguments(map)
                .build();
    }

    /**
     * 将订单交换机与订单队列绑定
     */
    @Bean
    Binding orderExchangeBindingOrder(@Qualifier("orderExchange") Exchange exchange,
                                      @Qualifier("orderQueue") Queue queue) {
        return BindingBuilder.bind(queue).to(exchange).with(ORDER_ROUTING).noargs();
    }

    /**
     * 死信交换机
     */
    @Bean("orderDeadExchange")
    public Exchange getOrderDeadExchange() {
        return new DirectExchange(ORDER_DEAD_EXCHANGE);
    }

    /**
     * 死信队列
     */
    @Bean("orderDeadQueue")
    public Queue getOrderDeadQueue() {
        return new Queue(
                ORDER_DEAD_QUEUE,//队列名
                true,//是否持久化
                false,//是否具有排他性,只在首次声明时可见,不允许其他用户访问,连接断开时自动删除
                false,//是否自动删除,经历过至少一次连接后,所有消费者都断开了连接,此队列会自动删除
                null
        );
    }

    /**
     * 将死信交换机与死信队列绑定
     */
    @Bean
    Binding deadExchangeBindingDeadQueue(@Qualifier("orderDeadExchange") Exchange exchange,
                                         @Qualifier("orderDeadQueue") Queue queue) {
        return BindingBuilder.bind(queue).to(exchange).with(ORDER_DEAD_ROUTING).noargs();
    }
}

五、发送消息的类

import com.sky.configuration.RabbitMQConfig;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;

/**
 * 消息队列发送消息
 */
@Component
public class SendRabbitMQ {
    @Autowired
    private RabbitTemplate rabbitTemplate;

    /**
     * @param orderId 15分钟后要检查的订单编号
     */
    public void sendDelayOrder(Long orderId) {
        rabbitTemplate.convertAndSend(
                RabbitMQConfig.ORDER_EXCHANGE,//订单交换机
                RabbitMQConfig.ORDER_ROUTING,//订单路由键
                orderId//要取消的订单编号
        );
    }
}

六、接收消息的类

import com.rabbitmq.client.Channel;
import com.sky.configuration.RabbitMQConfig;
import com.sky.mapper.OrderMapper;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;

/**
 * 消息队列接收消息
 */
@Component
public class ReceiveRabbitMQ {
    @Autowired
    private OrderMapper orderMapper;

    /**
     * @param orderId 要取消的订单的编号
     * @param msg     包含了要回复的队列
     * @param channel 有回复功能的参数
     */
    @RabbitListener(queues = RabbitMQConfig.ORDER_DEAD_QUEUE)
    public void ReceiveDeadOrder(Long orderId, Channel channel, Message msg) throws IOException {
        orderMapper.delCancelOrder(orderId);//查询数据库,订单是否付款,未付款:改为已取消
        channel.basicAck(msg.getMessageProperties().getDeliveryTag(),//应答的消息
                false//是否批量应答
        );
    }
}

七、在业务代码中注入发送类,并调用发送类的发送方法

@Service
public class OrderServiceImpl implements OrderService {
    @Autowired
    private SendRabbitMQ sendRabbitMQ;
    /**
     * 用户下单
     */
    public void submitOrder(OrdersSubmitDTO ordersSubmitDTO) {
        sendRabbitMQ.sendDelayOrder(order.getId());//发送延迟消息到消息队列
    }
}

到了这里,关于使用RabbitMQ实现延时消息自动取消的简单案例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • RabbitMQ实现延时消息的两种方法

    1、死信队列 1.1消息什么时候变为死信(dead-letter) 消息被否定接收,消费者使用basic.reject 或者 basic.nack并且requeue 重回队列属性设为false。 消息在队列里得时间超过了该消息设置的过期时间(TTL)。 消息队列到达了它的最大长度,之后再收到的消息。 1.2死信队列的原理 当一个

    2024年02月10日
    浏览(28)
  • Spring RabbitMQ那些事(2-两种方式实现延时消息订阅)

    业务开发中有很多延时操作的场景,比如最常见的 超时订单自动关闭 、 延时异步处理 ,我们常用的实现方式有: 定时任务轮询 (有延时)。 借助Redission的延时队列 。 Redis的key过期事件通知机制 (需开启key过期事件通知,对Redis有性能损耗)。 RocketMQ中定时消息推送 (支

    2024年02月04日
    浏览(27)
  • TP5简单使用RabbitMQ实现消息队列

    在使用 RabbitMQ 之前,你要安装好 RabbitMQ 服务,具体安装方法可以参考 windows下安装RabbitMQ 1、安装扩展 进入TP5 更目录下,输入命令安装: composer require php-amqplib/php-amqplib 2、自定义命令 TP5 的自定义命令,这里也简单说下。 第一步: 创建命令类文件,新建 application/api/command

    2024年02月07日
    浏览(36)
  • [Unity学习]使用ScrollRect实现自动滚动到底部显示实时消息,并在拖动的时候取消自动滚动,再次手动滑到底部,又继续自动滚动

    首先需要重写ScrollRect组件: 下面通过协程实现在不滚动ScrollRect的时候,自动滚动到底部。 使用时,写下面类似代码即可: Unity原生Scroll View更改配置如下: 其中ScrollView游戏物体更改组件如下: content配置如下: 实现效果如下: 大功告成!加上对象池模式控制添加的text实例

    2024年02月16日
    浏览(21)
  • rabbitMQ实现订单超时未支付自动取消订单

    下面展示一些 内联代码片 。 1.配置文件,导入jar包 2. 使用rabbitMQ插件绑定延时队列,插件可自动实现死信队列,无需配置 3. 生产者代码实现, 4. service层代码, 创建订单时,同步发送消息到mq,指定超时时间 5.消费者代码实现,修改订单的状态, 保存未支付订单表中数据

    2024年02月15日
    浏览(31)
  • RabbitMq应用延时消息

    一.建立绑定关系 二.建立生产者 1.消息实体 三.建立消费者 四.测试类测试 五.效果如图所示

    2024年02月12日
    浏览(25)
  • Centos安装RabbitMQ,JavaSpring发送RabbitMQ延迟延时消息,JavaSpring消费RabbitMQ消息

    erlang 和 rabbitmq 版本说明 https://www.rabbitmq.com/which-erlang.html 确认需要安装的mq版本以及对应的erlang版本。 RabbitMQ下载地址: https://packagecloud.io/rabbitmq/rabbitmq-server Erlang下载地址: https://packagecloud.io/rabbitmq/erlang RabbitMQ延迟消息插件下载 https://github.com/rabbitmq/rabbitmq-delayed-message-exc

    2024年02月08日
    浏览(39)
  • SpringBoot+RabbitMQ实现超时未支付订单自动取消,localhost:15672没有登录页面。

    简介 安装RabbitMQ需要安装Erlang/OTP,并保持版本匹配。 RabbitMQ官网:RabbitMQ: One broker to queue them all | RabbitMQ RabbitMQ与Erlang/OTP版本对照表:Erlang Version Requirements | RabbitMQ Erlang官网下载:Downloads - Erlang/OTP 1.Windows上安装RabbitMQ前需要安装Erlang。(下载安装不做叙述,除了需要自定义安

    2024年04月15日
    浏览(42)
  • RabbitMQ的基本使用,进行实例案例的消息队列

    目录 一、介绍 1. 概述 2. 作用 3. 工作原理 二、RabbitMQ安装部署 1. 安装 2. 部署 3. 增加用户 三、实现案例 1. 项目创建 2. 项目配置 3. 生产者代码 4. 消费者代码 四、测试 每篇一获 RabbitMQ  是一种开源的消息代理和队列服务器,用于通过简单和可扩展的方式在分布式系统中传递

    2024年01月20日
    浏览(25)
  • 【Bug】.net6 cap总线+rabbitmq延时消息收不到

    我有两个服务一个叫05一个叫15 然后用的cap总线+rabbitmq 05消息队列发了一条延时消息,到时间了05服务的订阅者能收到 15服务订阅同一个消息的没收到(cap的cashboard)(手动requeue05和15都能收到) 相关回答:.net6 cap总线+rabbitmq延时消息收不到 05:连接数据库配置: 15:连接数据库

    2024年01月19日
    浏览(24)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包