RabbitMQ实现延迟消息

前提条件

确保RabbitMQ已安装并启用了RabbitMQ Delayed Message插件。如果尚未启用,可以按照以下步骤操作:

  1. 下载插件:

    • 从RabbitMQ社区插件页面下载rabbitmq_delayed_message_exchange插件。
  2. 安装插件:

    • 将插件文件(.ez文件)放置在RabbitMQ插件目录中,通常为/usr/lib/rabbitmq/lib/rabbitmq_server-<version>/plugins
  3. 启用插件:

    rabbitmq-plugins enable rabbitmq_delayed_message_exchange
    

Maven依赖

在你的Maven项目的pom.xml中添加RabbitMQ客户端库的依赖:

<dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.13.0</version>
</dependency>

生产者(Producer)代码

import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;import java.util.HashMap;
import java.util.Map;public class Producer {private final static String EXCHANGE_NAME = "delayed_exchange";private final static String QUEUE_NAME = "delayed_queue";private final static String ROUTING_KEY = "delayed_key";public static void main(String[] argv) throws Exception {ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");try (Connection connection = factory.newConnection();Channel channel = connection.createChannel()) {// 声明延迟交换机Map<String, Object> args = new HashMap<>();args.put("x-delayed-type", BuiltinExchangeType.DIRECT.getType());channel.exchangeDeclare(EXCHANGE_NAME, "x-delayed-message", true, false, args);// 声明队列channel.queueDeclare(QUEUE_NAME, true, false, false, null);// 绑定队列到延迟交换机channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ROUTING_KEY);String message = "Hello World with delay!";int delay = 5000; // 延迟时间,以毫秒为单位// 设置消息属性,包括延迟时间Map<String, Object> headers = new HashMap<>();headers.put("x-delay", delay);AMQP.BasicProperties.Builder props = new AMQP.BasicProperties.Builder().headers(headers).deliveryMode(2); // 使消息持久化// 发布消息channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY, props.build(), message.getBytes("UTF-8"));System.out.println(" [x] Sent '" + message + "' with delay " + delay + " ms");}}
}

消费者(Consumer)代码

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DeliverCallback;public class Consumer {private final static String QUEUE_NAME = "delayed_queue";public static void main(String[] argv) throws Exception {ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");try (Connection connection = factory.newConnection();Channel channel = connection.createChannel()) {// 声明队列channel.queueDeclare(QUEUE_NAME, true, false, false, null);System.out.println(" [*] Waiting for messages. To exit press CTRL+C");DeliverCallback deliverCallback = (consumerTag, delivery) -> {String message = new String(delivery.getBody(), "UTF-8");System.out.println(" [x] Received '" + message + "'");};// 监听队列并处理消息channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> { });}}
}

说明

  1. 生产者(Producer)代码:

    • 声明了一个延迟交换机,类型为x-delayed-message,并设置了x-delayed-type参数为direct
    • 声明了一个队列并将其绑定到延迟交换机。
    • 设置消息的x-delay头部,指定延迟时间。
    • 将消息发布到延迟交换机。
  2. 消费者(Consumer)代码:

    • 声明了一个队列。
    • 使用DeliverCallback监听队列并处理收到的消息。

通过上述步骤和代码示例,你可以在Java中实现RabbitMQ的延迟消息功能。

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

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

相关文章

使用Github Actions自建Docker镜像仓库

使用Github Actions自建Docker镜像仓库 背景使用Github Actions自建Docker镜像仓库fork项目[docker_image_sync](https://github.com/xqxyxchy/docker_image_sync)获取云厂商容器镜像服务信息配置github secrets运行github action配置需要同步的镜像同步后效果华为云配置 背景 …

Casbin简单介绍、使用场景以及使用步骤

概述&#xff1a; Casbin是一个强大的、高效的开源访问控制框架&#xff0c;其权限管理机制支持多种访问控制模型&#xff0c;包括ACL&#xff08;访问控制列表&#xff09;、RBAC&#xff08;基于角色的访问控制&#xff09;和ABAC&#xff08;基于属性的访问控制&#xff09…

VCS+Vivado联合仿真BUG

场景&#xff1a; 在vcsvivado联合仿真过程中&#xff0c;对vivado导出的shell脚本修改&#xff0c;修改某些source文件路径&#xff0c;vcs编译时会报Permission Denied。 问题描述 对shell脚本修改如下&#xff1a; 修改仅为注释掉某一行&#xff0c;下面变为source文件新…

昇思25天学习打卡营第07天|函数式自动微分

神经网络的训练主要使用反向传播算法&#xff0c;模型预测值&#xff08;logits&#xff09;与正确标签&#xff08;label&#xff09;送入损失函数&#xff08;loss function&#xff09;获得loss&#xff0c;然后进行反向传播计算&#xff0c;求得梯度&#xff08;gradients&…

Laravel批量插入:提升数据库性能的秘诀

标题&#xff1a;Laravel批量插入&#xff1a;提升数据库性能的秘诀 在Web应用开发中&#xff0c;尤其是使用Laravel框架时&#xff0c;经常需要将大量数据插入数据库。Laravel的批量插入功能可以显著提高插入效率&#xff0c;减少对数据库的请求次数&#xff0c;从而提升应用…

Kubernetes RBAC 之 ServiceAccount

Kubernetes RBAC 之 ServiceAccount 定义 RABC 英文全称是 Role-Based Access Control&#xff0c;它通过角色绑定账户&#xff0c;来使得账户拥有某些操控 K8S 集群的权限。ServiceAccount 是集群内部 Pod 访问集群所使用的服务账户&#xff0c;它包括了 Namespace、Token、…

hid-ft260驱动学习笔记 1 - 驱动模块注册与注销

目录 1. ft260_driver_init初始化 1.1 tty设备 1.1.1 申请tty驱动设备 1.1.2 初始化tty驱动程序 1.1.3 注册tty设备 1.2 hid设备 2. ft260_driver_exit注销模块 3. 调试 hid-ft260.c的最底部可以看到该驱动的注册与注销接口的申明。 module_init(ft260_driver_init); …

C++:申明Declaration与定义Definition的本质与区别

在C中&#xff0c;声明和定义是两个不同的概念。 声明&#xff08;Declaration&#xff09; 声明是告诉编译器关于变量、函数等的存在以及它们的类型&#xff0c;但并不提供实际的存储空间或函数体。例如&#xff0c;你可以在程序的不同位置声明一个函数或者类&#xff0c;以…

eclipse ide中文件编码的修改,解决中文乱码的问题。

1、先上一张图&#xff1a; 记得之前设置过&#xff0c;但是稍微一变&#xff0c;环境编码又到了ISO-8859-1了&#xff0c;然后就出现了乱码。 2、设置eclipse的编码&#xff1a; Preferences--General -- Content Types -- Text -- Java Properties File -- Default encoding…

使用myCobot280和OAK-D OpenCV DepthAI摄像头制作一个实时脸部跟踪的手机支架!

引言 由于YouTube和Netflix的出现&#xff0c;我们开始躺着看手机。然而&#xff0c;长时间用手拿着手机会让人感到疲劳。这次我们制作了一个可以在你眼前保持适当距离并调整位置的自动移动手机支架&#xff0c;让你无需用手拿着手机。请务必试试&#xff01; 准备工作 这次我们…

名企面试必问30题(二十)——你对薪资的要求?

1.思路 1. 表明您对薪资的看法是基于自身能力、市场行情和公司薪酬体系的综合考量。 2. 强调您希望薪资能够合理反映您的专业技能、经验和对公司可能做出的贡献。 3. 提及您已经对市场和公司薪酬情况做了一定了解&#xff0c;给出一个大致合理的范围。 2.参考解答 话术示例…

Python内置函数print()详解

在Python编程中&#xff0c;print()函数是最常用的内置函数之一&#xff0c;用于将信息输出到标准输出设备&#xff0c;通常是屏幕。这个函数非常灵活&#xff0c;可以输出各种类型的数据&#xff0c;并且支持多种参数来定制输出格式。 函数功能 print()函数的主要功能是输出…

Vue3从入门到精通(三)

vue3插槽Slots 在 Vue3 中&#xff0c;插槽&#xff08;Slots&#xff09;的使用方式与 Vue2 中基本相同&#xff0c;但有一些细微的差异。以下是在 Vue3 中使用插槽的示例&#xff1a; // ChildComponent.vue <template><div><h2>Child Component</h2&…

借助ollama在linux离线环境上部署大模型

在mac上使用ollama下载并部署想要的模型。在linux上离线安装ollama&#xff1a;ollama离线安装。将mac的ollama的.ollama目录&#xff08;~/.ollama/&#xff09;完整拷贝到linux上&#xff08;/usr/share/ollama/.ollama/&#xff09;&#xff1a;拷贝ollama模型&#xff0c;从…

昇思25天学习打卡营第08天|模型训练

模型训练 模型训练一般分为四个步骤&#xff1a; 构建数据集。定义神经网络模型。定义超参、损失函数及优化器。输入数据集进行训练与评估。 现在我们有了数据集和模型后&#xff0c;可以进行模型的训练与评估。 ps&#xff1a;这里的训练和Stable Diffusion中的训练是一样…

深入理解C#中的文件系统I/O操作

文件系统I/O操作是任何编程语言中的重要组成部分&#xff0c;C#也不例外。无论是读写文件、操作目录&#xff0c;还是处理文件流&#xff0c;C#都提供了丰富且强大的类库来实现这些功能。本文将详细介绍C#中的文件系统I/O操作&#xff0c;并通过代码示例展示如何高效地处理文件…

进程的概念

一.进程和程序的理解 首先抛出结论&#xff1a;进程是动态的&#xff0c;暂时存在于内存中&#xff0c;进程是程序的一次执行&#xff0c;而进程总是对应至少一个特定的程序。 程序是静态的&#xff0c;永久的存在于磁盘中。 程序是什么呢&#xff1f;程序其实就是存放在我们…

图像分类-数据驱动方法

K近邻算法&#xff08;K-Nearest Neighbors&#xff0c;简称KNN&#xff09; KNN算法通过比较新样本与训练集中的样本的距离&#xff0c;然后根据最近的K个邻居的投票结果来决定新样本的分类。 如图所示&#xff0c;K越大的边界会更加平滑&#xff0c;本质上是根据某一样本最近…

红薯小眼睛接口分析与Python脚本实现

文章目录 1. 写在前面2. 接口分析3. 算法脚本实现 【&#x1f3e0;作者主页】&#xff1a;吴秋霖 【&#x1f4bc;作者介绍】&#xff1a;擅长爬虫与JS加密逆向分析&#xff01;Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Py…

04.27 - 05.18_111期_Linux_进程间通信

命名管道通信 特点&#xff0c;写端在没有往管道里面写内容时&#xff0c;读端会处于阻塞状态 共享内存 特点&#xff0c;读端在什么时候都可以进行读操作 &#xff0c;拷贝次数少&#xff0c;通信次数快 makefile 中使用g进行编译 要实现将上述两个特点进行融合&#xff…