midwayjs 框架使用 rabbitmq 消息延迟

插件rabbitmq_delayed_message_exchange是RabbitMQ官方提供的一种用于实现延迟消息的解决方案。该插件将交换机类型扩展至x-delayed-message,这种类型的交换机能够将消息暂时挂起,直到设定的延迟时间到达,才将消息投递到绑定的队列中。这一特性使得RabbitMQ能够轻松处理延迟消息的场景,无需额外的业务逻辑来定时检查和触发消息的投递。

插件需要在服务端安装并开启后使用。

消息发送:生产者向一个x-delayed-message类型的交换机发送消息,同时在消息属性中设置x-delay头,表示消息应延迟的时间(单位:毫秒)。
延迟处理:交换机接收到消息后,不会立即投递给队列,而是将其挂起,等待设定的延迟时间。在此期间,消息处于未投递状态。
消息投递:一旦达到延迟时间,交换机会将消息投递给与之绑定的队列。此时,消息的行为就像普通消息一样,可以被消费者消费。
消息消费:消费者从队列中拉取消息,执行相应的业务逻辑。

1、生产者:在service文件夹下建立rabbitmq.service.ts文件,通过调用sendDelayOrderToExchange方法发送消息,x-delay 设置延时时间  单位ms

import { Provide, Scope, ScopeEnum, Init, Autoload, Destroy, Config, Inject } from '@midwayjs/decorator';
import * as amqp from 'amqp-connection-manager';
import { ChannelWrapper, AmqpConnectionManager } from 'amqp-connection-manager';import * as dayjs from 'dayjs';const OPTIONS = { durable: true, autoDelete: true }; // 队列opts
const EXCHANGE_CHARGE_DELAY = 'exchange.charge.delay'; // 延时订单
const QUEUE_CHARGE_DELAY = 'queue.charege.delay';@Autoload()
@Provide()
@Scope(ScopeEnum.Singleton) // Singleton 单例,全局唯一(进程级别)
export class RabbitmqService {private connection: AmqpConnectionManager;private channelWrapper: ChannelWrapper;@Config('rabbitmq')mqConfig;@Inject()logger;@Init()async connect() {// 创建连接,你可以把配置放在 Config 中,然后注入进来this.connection = await amqp.connect(this.mqConfig);// 创建 channelthis.channelWrapper = await this.connection.createChannel({json: true,setup: function (channel) {return Promise.all([// 延时Exchangechannel.assertExchange(EXCHANGE_CHARGE_DELAY, 'x-delayed-message', {durable: true,autoDelete: true,arguments: {'x-delayed-type': 'direct',},}),channel.assertQueue(QUEUE_CHARGE_DELAY, OPTIONS),// 队列channel.bindQueue(QUEUE_CHARGE_DELAY, EXCHANGE_CHARGE_DELAY, 'DELAY_ORDER'),// 绑定交换机]);},});}// 发送预约订单public async sendDelayOrderToExchange(message: string) {this.logger.info(`发送延时订单:${message}  当前时间:${dayjs().format('YYYY-MM-DD HH:mm:ss')}`);await this.channelWrapper.publish(EXCHANGE_CHARGE_DELAY, 'DELAY_ORDER', message, {headers: { 'x-delay': 10 * 1000 },// 延时时间 单位毫秒});}@Destroy()async close() {await this.channelWrapper.close();await this.connection.close();}
}

2、消费者:在consumer文件夹下新建mq.consumer.ts,通过监听延时队列接受消息

import { Consumer, MSListenerType, RabbitMQListener, Inject } from '@midwayjs/decorator';
import { ConsumeMessage } from 'amqplib';
import { Context } from '@midwayjs/rabbitmq';import * as dayjs from 'dayjs';const QUEUE_CHARGE_DELAY = 'queue.charege.delay';@Consumer(MSListenerType.RABBITMQ)
export class UserConsumer {@Inject()ctx: Context;@Inject()logger;@RabbitMQListener(QUEUE_CHARGE_DELAY, {durable: true,autoDelete: true,})async delayOrder(msg: ConsumeMessage) {if (msg && msg.content) {const id = msg.content.toString('utf-8');this.logger.info(`预约订单号:${id} 当前时间:${dayjs().format('YYYY-MM-DD HH:mm:ss')}`);}}
}

在configuration.ts文件中调用测试

import { Configuration, App } from '@midwayjs/core';
import * as koa from '@midwayjs/koa';
.....
.....
.....
export class ContainerLifeCycle {@App()app: koa.Application;@Inject()rabbitmqService: RabbitmqService;async onReady() {await this.rabbitmqService.sendDelayOrderToExchange('123456789');}
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js做一个带模糊搜索、自动补全的select组件auto-input-select

效果图: 思路 原本是想弄一个输入框input,挡在原生select的前面,结果发现,原生select无论怎么弄,都无法js手动控制展开下拉选,必须点击select,这就很尴尬 然后就只能弄一个输入框input&#x…

python-变量声明、数据类型、标识符

一.变量 1.什么是变量 为什么需要变量呢? 一个程序就是一个世界,不论使用哪种高级程序语言编写代码,变量都是其程序的基本组成单位。如下图所示的sum和sub都是变量。 变量的定义: 变量相当于内存中一个数据存储空间的表示&#…

【Unity小工具】Image组件宽度、高度自适应

Unity开发中,用同一个Image进行动态加载不同尺寸的图片,在显示上会有形变此工具可以进行Image的宽度、高度自适应 实现原理 获取Image原始尺寸(sizeDelta)获取图片原始尺寸(spriteSizeDelta)公式&#xff…

Git 忽略已经提交的文件

对于未提交过的文件直接用ignore文件即可,不再赘述 对于已经提交过的文件,但是实际上不需要的,可以用git rm --cached命令 比如下图这个 .vsconfig被我误提交了或者忘了在ignore里添加了 但是我实际上不想要这个文件,那么在项目根目录打开git bash ,输入 git rm --cached .vsc…

【Hot100】LeetCode—34. 在排序数组中查找元素的第一个和最后一个位置

目录 1- 思路二分 - 左侧二分 右侧二分 2- 实现⭐34. 在排序数组中查找元素的第一个和最后一个位置——题解思路 3- ACM 实现 原题链接:34. 在排序数组中查找元素的第一个和最后一个位置 1- 思路 二分 - 左侧二分 右侧二分 右区间二分 ——> 找首次出现的位置…

unreal engine5.4.3动画重定向

UE5系列文章目录 文章目录 UE5系列文章目录前言 前言 ue5.4和ue3动画重定向之间存在差异,跟ue5.2差别更大一点,总之ue5.4越来越简化动画重定向,不想之前还需要制作RTG文件 这是ue5.3.2的制作动画重定向的界面 这是ue5.4.2的制作动画重定向…

编译FFmpeg动态库

编译FFmpeg动态库 环境 macOS High SierraFFmpeg 4.3android-ndk-r21b 编译so库 下载FFmpeg4.3源代码,进入源码目录创建build_android.sh脚本,ffmpeg从4.0起新增了target-osandroid,所以不用再修改configure文件。 注意: ndk…

k8s1.23 部署Prometheus-Operator集群监控

1. Prometheus-Operator介绍 Prometheus Operator 为 Kubernetes 提供了对 Prometheus 相关监控组件的本地部署和管理方案,该项目的目的是为了简化和自动化基于 Prometheus 的监控栈配置,主要包括以下几个功能: kubernetes自定义资源&#…

【网络安全】服务基础第一阶段——第八节:Windows系统管理基础---- Web服务与虚拟主机

目录 一、WWW概述 1.1 HTML 1.2 URI与URL 1.2.1 URL(统一资源标识符,Uniform Resource Locator) 1.3 HTTP 1.3.1 HTTP请求: 1.3.2 HTTP响应 1.3.3 状态码 1.4常见Web URL格式 实验一、网站搭建 1)访问失败可…

孩子自闭症的主要表现:探寻理解之门

自闭症,也称为孤独症,是一种复杂的神经发展障碍,它影响着孩子的社交互动、沟通能力以及行为模式。当家长注意到孩子出现自闭症倾向时,及时识别并寻求专业帮助至关重要。以下是孩子自闭症的一些主要表现,希望能为家长提…

温馨网站练习运用

第二次与团队一起制作网页虽然不进行商用,但是练习一下还是好的😊😊 我主要负责后端部分,该项目用了SpringBoot框架、SpringSecurity的安全框架、结合MyBatis-Plus的数据库查询。如果想看看,网站:温馨网登…

昇腾AI处理器的计算核心 - AI Core即DaVinci Core

昇腾AI处理器的计算核心 - AI Core即DaVinci Core flyfish 从一段代码的解释开始 template <typename T> class GlobalTensor { public:void setGlobalBuffer(T* buffer, uint32_t buffersize) {// 在这里实现设置全局缓冲区的逻辑} };语法的说明&#xff0c;主要用于…

SQLi-LABS靶场51-55通过攻略

第51关&#xff08;报错注入 闭合&#xff09; 查数据库 ?sort1%27%20and%20updatexml(1,concat(1,database()),3)-- 查表 ?sort1 and updatexml(1,concat(1,(select group_concat(table_name) from information_schema.tables where table_schemasecurity)),1)-- 第52关…

安装python软件

系统是32位还是64位 “此电脑"或者"我的电脑”&#xff0c;鼠标右键——属性&#xff0c;出现如下图查看电脑系统类型&#xff08;图中显示电脑系统类型是64位系统&#xff0c;安装Python则选择其名含有"adm64"字样的文件&#xff09;: 软件安装地址 全…

用AI生成旅游打卡照!FLUX假装去旅行lora的使用【附工作流】

hello&#xff01;今天我们来聊聊一个特别有意思的话题&#xff1a;如何用AI生成那些看起来像是去过世界各地的旅游打卡照&#xff0c;还能在朋友圈里炫耀一番。很多人看到这些照片都会问&#xff1a;“你真的去过这些地方吗&#xff1f;” 而且最主要的是这种图片做点自媒体旅…

提高工作效益方法(一)

目录 如何提高工作效率? 如何提高工作效率?&#xff08;每日工作安排&#xff09; 怎么在职场做好时间管理&#xff1f; 如何提高工作效率? 提高工作效率的关键在于采用一系列策略和方法&#xff0c;以确保工作能够高效、有序地进行。通过这些方法&#xff0c;可以有效地提…

银河麒麟编译opencv库并配置qt环境

1.opencv下载版本:opencv4.5.5,qt安装的是qt5.12.11,系统版本: 2.首先应该安装cmake工具: 下载地址:https://cmake.org/download/ 安装步骤: 1)解压; 2)进入解压后的文件夹cd cmake-3.30.2 3)./bootstrap 4)sudo make 5)sudo make install 3.下载opencv,下…

7个流行的开源数据治理工具

数字化时代&#xff0c;数据是已经成为最宝贵的资产之一。数据支撑着我们的政府、企业以及各类组织的所有流程&#xff0c;并为决策以及智能化服务提供支撑。大数据有大用途&#xff0c;但是也可能隐藏着巨大的风险&#xff0c;特别是如果我们对数据的情况不是很了解的时候&…

第二证券:两市成交不足5000亿元 小盘成长股逆势活跃

A股持续小幅颤动&#xff0c;银行等大盘蓝筹股呈现调整&#xff0c;小盘生长股则逆势反弹&#xff0c;创业板指、中证500、中证1000等指数小幅飘红。到收盘&#xff0c;沪指跌0.4%报2837.43点&#xff0c;深证成指跌0.31%报8078.82点&#xff0c;创业板指微涨0.05%报1531.45点&…

掌控安全CTF-2024年8月擂台赛-ez_misc

题解&#xff1a; 题目给了一个流量包和一个加密的zip文件&#xff0c;我们首先打开流量包&#xff0c;很多流量&#xff0c;查看一下http协议&#xff0c;发现是个sql靶场&#xff0c;找到关键字样flag&#xff0c;得到一串字符&#xff1a; LJWXQ2C2GN2DAYKHNR5FQMTMPJMDER…