采用RibbaitMq延迟队列官方插件实现延迟队列

这篇具有很好参考价值的文章主要介绍了采用RibbaitMq延迟队列官方插件实现延迟队列。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

RibbaitMq插件实现延迟队列主要是延迟消息到交换机的时间。

TTL+死信队列实现延时队列:正常消息过期没有被消费掉,进入死信队列后立即消息。

本章主要采用第一种方式。

一、前期准备工作

1.安装RabbirMQ自行百度或者参考推荐资源:

RabbitMQ部署-Windows篇 - 知乎

RabbitMQ windows下的安装与配置 - 腾讯云开发者社区-腾讯云

安装成功图

采用RibbaitMq延迟队列官方插件实现延迟队列

 2. 下载rabbitmq_delayed_message_exchange-3.11.1插件并上传到指定文件夹中,

    插件版本根据ribbitmq版本选择:Community Plugins — RabbitMQ

采用RibbaitMq延迟队列官方插件实现延迟队列

 

 3. 进入sbin目录,打开管理员控制台,输入如下命令,显示类似信息即可:

rabbitmq-plugins enable rabbitmq_delayed_message_exchange

采用RibbaitMq延迟队列官方插件实现延迟队列 4.重新双击sbin目录下的rabbitmq-server.bat文件,启动rabbitmq服务。

 5.启动服务之后打开rabbitmq管理官新增交换机即可看到新的交换模式。

二、编码

1.在pom.xml文件中添加AMQP相关依赖

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

2.在application.yml添加RabbitMQ的相关配置

  rabbitmq:
    port: 5672
    host: localhost
    username: admin
    password: 123456
    listener:
      direct:
        acknowledge-mode: manual
      simple:
        acknowledge-mode: manual
        retry:
          enabled: true
          max-attempts: 5
          initial-interval: 3000
    virtual-host: newCore
    publisher-confirm-type: correlated
    publisher-returns: true

3.采用RibbaitMq延迟队列官方插件,新的方法实现延迟队列

package com.hxnwm.ny.diancan.common.config;

import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

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

/**
 * RabbitMQ延时消息配置
 * @time 2022/3/11 11:40
 */
@Configuration
public class RabbitMQLazyConfig {
   
    // ----- 订单处于已完成状态后的24小时后,对应操作  此部分采用插件 延迟发送到交换机的时间实现延迟队列 wdj-----
    //队列
    public static final String ACT_SETTLE_DELAY_QUEUE = "act.settle.delay.queue";
    //交换机
    public static final String ACT_SETTLE_DELAY_EXCHANGE = "act.settle.delay.exchange";

    public static final String ACT_SETTLE_DELAY_ROUTING_KEY ="act.settle.delay.routing.key";

    @Bean
    public Queue delaySettleQueue() {
        return new Queue(ACT_SETTLE_DELAY_QUEUE, true, false, false);
    }

    @Bean
    public CustomExchange delaySettleExchange() {
        Map<String, Object> args = new HashMap<>();
        args.put("x-delayed-type", "direct");
        return new CustomExchange(ACT_SETTLE_DELAY_EXCHANGE, "x-delayed-message", true, false, args);
    }

    @Bean
    public Binding bindingSettleDelay() {
        return BindingBuilder.bind(delaySettleQueue()).to(delaySettleExchange()).with(ACT_SETTLE_DELAY_ROUTING_KEY).noargs();
    }
}

 延时队列工具类

@Component
@Slf4j
//订单工具类
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class OrderUtils {

    @Resource
    private AmqpTemplate amqpTemplate;
    /**
     *订单完成后24小时,给B端发消息
     *
     * @param order
     * @return void
     * @Author wdj
     * @date 2023/3/22 16:23
     */
    public void delayedSettleOrder(Order order) {
        this.amqpTemplate.convertAndSend(RabbitMQLazyConfig.ACT_SETTLE_DELAY_EXCHANGE, RabbitMQLazyConfig.ACT_SETTLE_DELAY_ROUTING_KEY, order, message -> {
            //给消息设置延迟毫秒值
            message.getMessageProperties().setDelay(1000);//24小时后发送消息到B端 改成1秒
            message.getMessageProperties().setDeliveryMode(MessageDeliveryMode.PERSISTENT);
            return message;
        });
        log.info("把订单完成24小时后{},发送到rabbitmq队列中", order.getOrderSn());
    }
}

 service层或者controller层根据业务需求调用this.orderUtils.delayedSettleOrder(order);

                //线下扫码支付:门店+余额支付成功,发送收益到B端
                this.orderUtils.delayedSettleOrder(order);

 延时消息监听类:主要对消息进行消费逻辑处理。文章来源地址https://www.toymoban.com/news/detail-408402.html

  /**
 * 延时任务监听
 *
 * @author knight
 * @time 2022/3/11 10:40
 */
@Slf4j
@Component
public class LazyOrderListener {
    @Resource
    private OrderService orderService;

    @Resource
    private BApiUtils bApiUtils;

 /**
     * @Description:订单处于已完成状态后的24小时后,将订单推送给B端
     * @param order 
     * @Author: wdj
     * @Date: 2023/3/22 
     */
    @RabbitListener(queues = RabbitMQLazyConfig.ACT_SETTLE_DELAY_QUEUE)
    @Transactional(rollbackFor = Exception.class)
    public void listenDelayedSettleOrder(Order order){
        log.info("监听到订单完成 " + order.getOrderSn());
        try {
          /*  这部分是业务逻辑,请忽略
           Order order1 = this.orderService.info(order.getId(), order.getOrderSn());
            if (Objects.isNull(order1)) {
                log.info("订单未找到,退出");
                throw new Exception("订单未找到");
            }
            // 判断订单状态是否处于已完成
            if (!Objects.equals(order1.getStatus(), Order.STATUS.STATUS_0020.status)) {
                log.info("订单状态处于未完成状态,退出");
                throw new Exception("订单状态处于未完成状态,退出");
            }
            //开发阶段不用一直发送消息,记得测试要放行
            bApiUtils.sendDelayedSettleOrder(order.getId());
          */
            log.info("监听订单处理成功");
        }catch (Exception e){
            e.printStackTrace();
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            log.info("监听订单处理失败回滚");
        }
    }
}

到了这里,关于采用RibbaitMq延迟队列官方插件实现延迟队列的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Docker版RabbitMQ安装延迟队列插件及延迟队列项目应用实战

    在项目中经常有延迟业务处理的背景,此时可以借助于Rabbitmq的延迟队列进行实现,但Rabbitmq本身并不支持延迟队列,但可以通过安装插件的方式实现延迟队列 首先确认目前项目使用的Rabbitmq的版本,这里博主的版本是3.9.15的。 访问 Rabbitmq的github网址,检索 delay 找到插件 rabb

    2024年02月02日
    浏览(31)
  • Rabbitmq 延迟队列---插件

            解决没法优先发送延时时间短的消息。 插件安装 配置类 生产者 消费者

    2024年02月12日
    浏览(48)
  • liunx+docker+rabbitmq安装延迟队列插件

    前言 在这篇文章中,我们将讨论如何在 Linux 系统上安装 Docker 和 RabbitMQ,并设置延迟队列。 Docker 是一个开放源代码的软件,它可以使应用程序的部署更加简单,而 RabbitMQ 是一个开放源代码的消息代理软件,它接受和转发消息。 延迟队列是一种在特定的延迟之后才开始处理

    2024年02月11日
    浏览(36)
  • Docker中为RabbitMQ安装rabbitmq_delayed_message_exchange延迟队列插件

    1、前言 rabbitmq_delayed_message_exchange是一款向RabbitMQ添加延迟消息传递(或计划消息传递)的插件。 插件下载地址:https://www.rabbitmq.com/community-plugins.html 1、下载插件 首先需要确定我们当前使用的RabbitMQ的版本,我们可以直接登录Web端的管理界面查看版本   也可以在RabbitMQ容器中

    2024年02月12日
    浏览(36)
  • RabbitMQ实现延迟消息的方式-死信队列、延迟队列和惰性队列

    当一条消息因为一些原因无法被成功消费,那么这这条消息就叫做死信,如果包含死信的队列配置了dead-letter-exchange属性指定了一个交换机,队列中的死信都会投递到这个交换机内,这个交换机就叫死信交换机,死信交换机再绑定一个队列,死信最终会进入到这个存放死信的

    2024年02月19日
    浏览(36)
  • RabbitMQ之TTL+死信队列实现延迟队列

    RabbitMQ是一个流行的消息队列系统,它提供了许多有用的功能,其中之一是TTL(Time To Live)和死信队列。这些功能可以用来实现延迟队列,让我们来看看如何使用它们。 首先,什么是TTL?TTL是消息的存活时间,它可以设置为一个特定的时间段。如果消息在这个时间段内没有被

    2024年02月13日
    浏览(31)
  • redisson实现延迟队列

    1.pom引入redisson 整合springboot配置,这个可以参考之前整合redisson的文章,或者上面一步直接引用 redisson整合好的springboot的包 如下(本人是引入的redisson自己整合的springboot,实际一样的 只要redisson可以使用,就成功) 3.配置redis的队列 4.创建redis的队列类 5.测试controller

    2024年02月22日
    浏览(34)
  • Kafka延迟队列的实现方式

    在现代的分布式系统中,延迟队列是一种常见的解决方案,用于处理具有延迟要求的任务或消息。Apache Kafka是一个高性能、可扩展的分布式消息队列,可以作为延迟队列的基础设施。本文将介绍如何使用Kafka实现延迟队列,并提供详细的Java示例。 延迟队列是一种特殊的消息队

    2024年02月13日
    浏览(21)
  • Redis实现延迟队列方法介绍

    延迟队列,顾名思义它是一种带有延迟功能的消息队列。那么,是在什么场景下我才需要这样的队列呢? 1. 背景 我们先看看以下业务场景: 当订单一直处于未支付状态时,如何及时的关闭订单 如何定期检查处于退款状态的订单是否已经退款成功 在订单长时间没有收到下游

    2024年02月09日
    浏览(26)
  • Redis实现延迟任务队列(一)

    业务里面需要文章的定时发布功能,因此打算采用mq和redis来实现一下定时发布的功能。mq之前用过了。基于一些私信交换机地信息过期策略实现。所以这次采用redis。并且打算将这个延迟任务的服务集成在一个微服务里面,提供对外的feign的远程调用接口,这样就可以一劳永逸

    2024年01月16日
    浏览(28)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包