超简单的RabbitMq实现订单超时自动取消

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

很简单的实现方法,大家帮忙看看能不能继续完善。

rabbitmq死信队列 订单超时,java-rabbitmq,rabbitmq,springboot

步骤:

  1. 添加rabbitmq配置
  2. 添加rabbitmq配置类
  3. 添加订单生产者
  4. 添加订单消费者(修改状态)

1、添加rabbitmq配置

注意一定要开启手动应答,不然可能会报错

spring  
  rabbitmq:
    host: 你的地址
    port: 5672
    username: admin
    password: admin
    listener:
      simple:
#        开启手动应答
        acknowledge-mode: manual

2、添加rabbitmq配置类

下面这段代码看着有点繁琐,我解释一下逻辑关系。

rabbitmq死信队列 订单超时,java-rabbitmq,rabbitmq,springboot

1、声明订单交换机、声明订单队列,在订单队列中声明绑定的死信交换机

2、订单交换机Binding订单队列

3、声明死信交换机、队列并且Binding

package com.lutao.config;

import com.rabbitmq.client.AMQP;
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;

@Configuration
public class RabbitMqConfig {

    public static final String ORDER_QUEUE = "order_queue";
    public static final String ORDER_EXCHANGE = "order_exchange";
    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_ROUTING = "order_routing";
    public static final String ORDER_DEAD_ROUTING = "order_dead_routing";
    /**
     * 订单交换机
     */
    @Bean("orderExchange")
    public DirectExchange getOrderExchange(){
        return new DirectExchange(ORDER_EXCHANGE);
    }
    /**
     * 订单队列
     */
    @Bean("orderQueue")
    public Queue getOrderQueue(){
        HashMap<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",30000);
        return QueueBuilder.durable(ORDER_QUEUE).withArguments(map).build();
    }

    /**
     * 订单交换机与订单队列绑定
     */
    @Bean
    public Binding oExchangeBindingO(
            @Qualifier("orderExchange") DirectExchange exchange,
            @Qualifier("orderQueue") Queue queue
    ){
        return BindingBuilder.bind(queue).to(exchange).with(ORDER_ROUTING);
    }
    /**
     * 死信交换机
     */
    @Bean("orderDeadExchange")
    public DirectExchange getOrderDeadExchange(){
        return new DirectExchange(ORDER_DEAD_EXCHANGE);
    }
    /**
     * 死信队列
     */
    @Bean("orderDeadQueue")
    public Queue getOrderDradQueue(){
        return new Queue(ORDER_DEAD_QUEUE,true,false,false,null);
    }

    @Bean
    public Binding deadExchangeDead(
            @Qualifier("orderDeadExchange") DirectExchange exchange,
            @Qualifier("orderDeadQueue") Queue queue
    ){
        return BindingBuilder.bind(queue).to(exchange).with(ORDER_DEAD_ROUTING);
    }
}

3、添加订单生产者

在插入新订单数据时,向订单队列发送一条延迟时间为30秒的信息

@Override
    @Transactional
    public void insertOrder(OT ot) {
        Orders orders = new Orders();
        BeanUtils.copyProperties(ot, orders);
        List<CartVO> listCart = ot.getListCart();
        //生成订单号
        String onumber = get16UUID();
        orders.setOnumber(onumber);
        ordersMapper.insertOrder(orders);
        //删除购物车
        Integer[] cids = new Integer[listCart.size()];
        for (int i = 0; i < listCart.size(); i++) {
            CartVO cartVO = listCart.get(i);
            ordersMapper.insertGoods(onumber, cartVO);
            cids[i] = listCart.get(i).getCid();
        }
        //发送到队列中
        //将订单编号发送到队列中
        log.info("将订单编号发送到订单队列中");
        rabbitTemplate.convertAndSend(RabbitMqConfig.ORDER_EXCHANGE,RabbitMqConfig.ORDER_ROUTING,orders.getOnumber());
        cartMapper.deleteCid(cids);
    }

4、死信队列消费者处理信息

30秒后订单进入死信队列,由消费者消费,根据订单号查询订单的状态如果还是0(未支付)则将状态更新成(2)已取消。文章来源地址https://www.toymoban.com/news/detail-679328.html

@Autowired
    private OrdersMapper ordersMapper;
    /**
     * 判断是否在规定时间内支付
     *
     * @param message
     * @param channel
     * @throws IOException
     */
    @RabbitListener(queues = RabbitMqConfig.ORDER_DEAD_QUEUE)
    public void receive(Message message, Channel channel) throws IOException {
        log.info("订单进入死信队列");
        String msg = new String(message.getBody());
        log.info("订单号:"+msg);
        OrderPageRequest request = new OrderPageRequest();
        request.setOnumber(msg);
        Integer status = ordersMapper.getStatusByONumber(msg);
        if (status != null && status == 0){
            ordersMapper.updateStatus(msg,2);
        }
        //应答
        channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
    }

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

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

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

相关文章

  • 简单的RabbitMQ集成Springboot实现订单异步发送功能示例以及RabbitMQ的相关问题

    引入RabbitMQ的依赖,在pom.xml文件中添加以下代码: 在application.properties文件中配置RabbitMQ的相关信息: 创建消息队列,并定义消息接收者: 定义消息发送者: 在需要发送订单信息的地方调用OrderSender的send方法即可: RabbitMQ是一个开源的消息中间件,主要用于实现应用之间的异

    2024年02月09日
    浏览(39)
  • 商城系统中30分钟未付款自动取消订单怎么实现(简单几种方法)

    实现以上功能 写一个定时任务,每隔 30分钟执行一次,列出所有超出时间范围得订单id的列表 批量执行取消订单操作 实现一个简单的队列,每隔一定时间执行队列。 这里使用队列的优势可以跟前端时间匹配上,前端读秒几秒这里就什么时候取消  使用mq队列,消费消息。如

    2024年01月24日
    浏览(35)
  • 支付超时取消订单实现方案 - 定时任务、延迟队列、消息队列等

    在实际业务场景中,我们经常会碰到类似一下场景: 淘宝等购物平台在订单支付时,如果30分钟内未支付自动取消。 腾讯会议预约会议后,在会议开始前15分钟提醒。 未使用的优惠券有效期结束后,自动将优惠券状态更新为已过期。 等等。。。 像这种支付超时取消的场景需

    2024年04月22日
    浏览(42)
  • 订单自动取消的11种实现方式(下)

    在Redis中,有个发布订阅的机制 生产者在消息发送时需要到指定发送到哪个channel上,消费者订阅这个channel就能获取到消息。图中channel理解成MQ中的topic。 并且在Redis中,有很多默认的channel,只不过向这些channel发送消息的生产者不是我们写的代码,而是Redis本身。这里面就有

    2024年02月13日
    浏览(32)
  • 生成订单30分钟未支付,则自动取消,该怎么实现?

    今天给大家上一盘硬菜,并且是支付中非常重要的一个技术解决方案,有这块业务的同学注意自己试一把了哈! 在开发中,往往会遇到一些关于延时任务的需求。例如 生成订单30分钟未支付,则自动取消 生成订单60秒后,给用户发短信 对上述的任务,我们给一个专业的名字来

    2024年02月09日
    浏览(45)
  • Spring Boot中实现订单30分钟自动取消的策略

    🎉欢迎来到架构设计专栏~Spring Boot中实现订单30分钟自动取消的策略 ☆* o(≧▽≦)o *☆嗨~我是IT·陈寒🍹 ✨博客主页:IT·陈寒的博客 🎈该系列文章专栏:架构设计 📜其他专栏:Java学习路线 Java面试技巧 Java实战项目 AIGC人工智能 数据结构学习 🍹文章作者技术和水平有限,

    2024年02月08日
    浏览(58)
  • 使用RabbitMQ死信队列关闭未支付的订单

    RabbitMQ死信队列(Dead-Letter Exchange,简称DLX)是一种特殊类型的交换机,用于处理在队列中无法被消费的消息。当消息无法被消费时,它会被转发到死信队列中,以便进一步处理。 在RabbitMQ中,死信队列通常用于处理以下情况: 消息无法被消费者处理:例如,如果消费者崩溃

    2024年02月11日
    浏览(38)
  • 设置RabbitMQ超时时间

    RabbitMQ默认的超时时间是30分钟,在消息消费超过30分钟后,rabbitMQ会发生错误,导致整个channel被销毁,无法继续消费 在RabbitMQ安装的终端执行 命令,将超时时间延长。 使用 可以查看设置的超时值。 值得注意的是,这个事临时更改,永久更改需要进入 rabbitmq.con f 文件里修改

    2024年02月04日
    浏览(41)
  • Springboot与RabbitMQ消息超时时间、队列消息超时时间

    TTL是 Time-To-Live 的缩写,RabbitMQ可以对消息和队列设置TTL(过期时间)。 RabbitMQ针对队列中的消息过期时间(Time To Live, TTL)有两种方法可以设置。 第一种方法是通过队列属性设置,队列中所有消息都有相同的过期时间。 第二种方法是对消息进行单独设置,每条消息TTL可以不同。

    2024年02月09日
    浏览(48)
  • SpringBoot实现RabbitMQ的简单队列(SpringAMQP 实现简单队列)

    SpringAMQP 是基于 RabbitMQ 封装的一套模板,并且还利用 SpringBoot 对其实现了自动装配,使用起来非常方便。 SpringAmqp 的官方地址:https://spring.io/projects/spring-amqp 说明 : 1.Spring AMQP 是对 Spring 基于 AMQP 的消息收发解决方案,它是一个抽象层,不依赖于特定的 AMQP Broker 实现和客户端

    2024年04月13日
    浏览(40)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包