当前位置: 首页 > news >正文

如何使用Java和RabbitMQ实现延迟队列(方式二)?

前言

昨天写了一篇关于Java和RabbitMQ使用插件实现延迟队列功能的文章,今天来讲下另外一种方式,不需要RabbitMQ的插件。

前期准备,需要安装好docker、docker-compose的运行环境。

需要安装RabbitMQ的可以看下面这篇文章。

如何使用PHP和RabbitMQ实现消息队列?-CSDN博客

使用RabbitMQ插件实现延迟队列功能的文章,可以查看下面的文章。

如何使用Java和RabbitMQ实现延迟队列?-CSDN博客

一、编写代码

1、使用springboot框架快速搭建一个项目。

2、在 pom.xml 中添加 Spring Boot AMQP 的依赖,内容如下。


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

3、在 application.yml 中配置 RabbitMQ 的连接信息,内容如下。

spring:rabbitmq:host: localhostport: 5672username: guestpassword: guest

4、在配置类中定义交换机、队列和绑定,内容如下。

package com.ayzen.hello;import java.util.HashMap;
import java.util.Map;import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class RabbitMqConfig {@Bean  public Queue delayQueue() {  Map<String, Object> args = new HashMap<>();  args.put("x-dead-letter-exchange", "dlx_exchange"); // 设置死信交换机 args.put("x-dead-letter-routing-key", "dlx_key"); // 设置死信路由  args.put("x-message-ttl", 5000); // 设置默认 TTL(毫秒),也可以动态设置  return new Queue("delay_queue", true, false, false, args);  }  @Bean  public Queue dlxQueue() {  return new Queue("dlx_queue", true);  }  @Bean  public DirectExchange delayExchange() {  return new DirectExchange("delay_exchange");  }  @Bean  public DirectExchange dlxExchange() {  return new DirectExchange("dlx_exchange");  }   @Bean  public Binding binding(Queue delayQueue, DirectExchange delayExchange) {  return BindingBuilder.bind(delayQueue).to(delayExchange).with("dlx_key");  }  @Bean  public Binding dlxBinding(Queue dlxQueue, DirectExchange dlxExchange) {  return BindingBuilder.bind(dlxQueue).to(dlxExchange).with("dlx_key");  }}

5、创建一个生产者,发送一个带有延迟属性的消息,内容如下。

package com.ayzen.hello;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageBuilder;
import org.springframework.amqp.core.MessageProperties;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/test")
public class TestController {final Logger logger = LoggerFactory.getLogger(getClass());@AutowiredRabbitTemplate rabbitTemplate;@GetMapping("/send")public ResponseEntity<Object> send() {this.sendDelayMessage("sendDelayMessage", 5000);return ResponseEntity.ok(ResponseDto.success("ok"));}private void sendDelayMessage(String message, long ttlInMilliseconds) {MessageProperties messageProperties = new MessageProperties();messageProperties.setExpiration(Long.toString(ttlInMilliseconds));Message msg = MessageBuilder.withBody(message.getBytes()).andProperties(messageProperties).build();rabbitTemplate.send("delay_exchange", "dlx_key", msg);logger.info("send message to rabbitmq.");}
}

6、创建一个消息者,监听接收队列中的消息,内容如下。

package com.ayzen.learnjava.hello.service;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;@Component
public class TestService {final Logger logger = LoggerFactory.getLogger(getClass());@RabbitListener(queues = "dlx_queue")public void process(String message) {logger.info("process message from rabbitmq,message={}", message);}
}

7、至此,测试项目代码已完成,下一步将进行验证。

二、测试验证

1、启动服务。

2、调用生产者,执行如下代码。

curl http://127.0.0.1:8080/test/send

3、查看日志,正常情况会返回如下内容。

如上图所示,在2024-04-08T10:23:40.478+08:00接收到生产者的请求,然后在2024-04-08T10:23:45.587+08:00执行消费动作,延迟5秒。

4、至此,使用Java和RabbitMQ实现延迟队列的功能已验证完毕。

总结

用Java和RabbitMQ实现消息队列的延迟功能的另外一种方式,其实依靠的是死信交换机,主要有以下几个步骤。

1、配置死信交换机(Dead-Letter-Exchange)。

2、编写Java测试项目。

3、进行测试验证。

上面的代码只是做个简单的示例,如果运用到实际的项目当中需要做进一步的优化。

最后因本人能力有限,有什么不对的地方望各位大佬指出好让我改进,多多包含,谢谢大家。

相关文章:

如何使用Java和RabbitMQ实现延迟队列(方式二)?

前言 昨天写了一篇关于Java和RabbitMQ使用插件实现延迟队列功能的文章&#xff0c;今天来讲下另外一种方式&#xff0c;不需要RabbitMQ的插件。 前期准备&#xff0c;需要安装好docker、docker-compose的运行环境。 需要安装RabbitMQ的可以看下面这篇文章。 如何使用PHP和R…...

String.valueOf() 将各种数据类型的值转换为它们的字符串

String.valueOf() 是 Java 中 String 类的一个静态方法&#xff0c;用于将各种数据类型的值转换为它们的字符串表示形式。这个方法在多种情况下都非常有用&#xff0c;特别是当你需要将非字符串类型的值转换为字符串时。 方法签名 String.valueOf() 方法有多个重载版本&#…...

2024-04-08 NO.6 Quest3 自定义交互事件

文章目录 1 交互事件——更改 Cube 颜色2 交互事件——创建 Cube2.1 非代码方式2.2 代码方式 ​ 在开始操作前&#xff0c;我们导入上次操作的场景&#xff0c;相关介绍在 《2024-04-08 NO.5 Quest3 手势追踪进行 UI 交互-CSDN博客》 文章中。 1 交互事件——更改 Cube 颜色 …...

素描进阶:深入探索如何表现石膏像的质感

​素描进阶&#xff1a;深入探索如何表现石膏像的质感 素描&#xff0c;作为一种古老而经典的绘画方式&#xff0c;历来都被视为是艺术家们探索世界、理解形式与质感的重要工具。而在素描的过程中&#xff0c;如何精准地捕捉并表现物体的质感&#xff0c;是每位艺术家都需要深…...

flutter组件_AlertDialog

官方说明&#xff1a;A Material Design alert dialog. 翻译&#xff1a;一个材料设计警告对话框。 作者释义&#xff1a;显示弹窗&#xff0c;类似于element ui中的Dialog组件。 AlertDialog的定义 const AlertDialog({super.key,this.icon,this.iconPadding,this.iconColor,t…...

供应链领域主题:生产制造关键术语和系统

BOM&#xff08;Bill of Material&#xff09;物料清单 BOM&#xff08;Bill of Material&#xff09;物料清单&#xff0c;是计算机可以识别的产品结构数据文件&#xff0c;也是ERP的主导文件。BOM使系统识别产品结构&#xff0c;也是联系与沟通企业各项业务的纽带。ERP系统中…...

k8s_入门_kubelet安装

安装 在大致了解了一些k8s的基本概念之后&#xff0c;我们实际部署一个k8s集群&#xff0c;做进一步的了解 1. 裸机安装 采用三台机器&#xff0c;一台机器为Master&#xff08;控制面板组件&#xff09;两台机器为Node&#xff08;工作节点&#xff09; 机器的准备有两种方式…...

主干网络篇 | YOLOv5/v7 更换骨干网络之 HGNetv2 | 百度新一代超强主干网络

本改进已融入到 YOLOv5-Magic 框架。 论文地址:https://arxiv.org/abs/2304.08069 代码地址:https://github.com/PaddlePaddle/PaddleDetection 中文翻译:https://blog.csdn.net/weixin_43694096/article/details/131353118 文章目录 HGNetv2网络结构1.1 主干网络1.2 颈部…...

JUC:ScheduledThreadPoolExecutor 延迟任务线程池的使用

文章目录 ScheduledThreadPoolExecutortimer&#xff08;不建议用&#xff09;ScheduledThreadPoolExecutor处理异常应用 ScheduledThreadPoolExecutor timer&#xff08;不建议用&#xff09; timer也可以进行延迟运行&#xff0c;但是会有很多问题。 比如task1运行时间超过…...

js str字符串和arr数组互相转换

js str字符串和arr数组互相转换 字符串转为数组 1、split()方法 返回的是原字符串的数组 var str "hello"; var arr str.split(""); console.log(arr); //输出["h", "e", "l", "l", "o"]2、Ar…...

计算机网络——40各个层次的安全性

各个层次的安全性 安全电子邮件 Alice需要发送机密的报文m给Bob Alice 产生随机的对称秘钥&#xff0c; K s K_s Ks​使用 K s K_s Ks​对报文进行加密&#xff08;为了效率&#xff09;对 K s K_s Ks​使用Bob的公钥进行加密发送 K s ( m ) K_s(m) Ks​(m)和 K B ( K S ) K…...

OpenHarmony实战:Combo解决方案之W800芯片移植案例

本方案基于OpenHarmony LiteOS-M内核&#xff0c;使用联盛德W800芯片的润和软件海王星系列Neptune100开发板&#xff0c;进行开发移植。 移植架构采用Board与SoC分离方案&#xff0c;支持通过Kconfig图形化配置编译选项&#xff0c;增加玄铁ck804ef架构移植&#xff0c;实现了…...

【数据结构】数组(稀疏矩阵、特殊矩阵压缩、矩阵存储、稀疏矩阵的快速转置、十字链表)

稀疏矩阵、矩阵压缩、稀疏矩阵的快速转置、十字链表 目录 稀疏矩阵、矩阵压缩、稀疏矩阵的快速转置、十字链表1.数组2.数组的顺序表示和实现3.特殊矩阵的压缩存储&#xff08;1&#xff09;. 上三角矩阵—列为主序压缩存储&#xff08;2&#xff09;. 下三角矩阵—**行为主序压…...

nginx 配置访问地址和解决跨域问题(反向代理)

1、配置访问地址&#xff08;通过ip访问&#xff09; //配置ip访问地址 location ^~/auditApp{alias /usr/local/front-apps/cbd/auditApp;index index.html;if (!-e $request_filename) {rewrite ^/(.*) /auditApp/index.html last;break;}} 2、解决跨域问题&…...

支持向量机(SVM)白话之个人理解(学习记录)

本文仅有文字理解部分&#xff0c;没有相应的数学公式推导过程&#xff0c;便于新手理解。 一、什么是支持向量机 首先我们看下面这张图&#xff0c;在图中圆形和三角形分别代表不同的数据类型&#xff0c;如何画出一条直线使两者能够显著地区分开来呢&#xff1f; 答案可以多…...

【运输层】TCP 的可靠传输是如何实现的?

目录 1、发送和接收窗口&#xff08;滑动窗口&#xff09; &#xff08;1&#xff09;滑动窗口的工作流程 &#xff08;2&#xff09;滑动窗口和缓存的关系 &#xff08;3&#xff09;滑动窗口的注意事项 2、如何选择超时重传时间 &#xff08;1&#xff09;加权平均往返…...

K8s技术全景:架构、应用与优化

一、介绍 Kubernetes的历史和演进 Kubernetes&#xff08;简称K8s&#xff09;是一个开源的容器编排系统&#xff0c;用于自动化应用程序的部署、扩展和管理。它最初是由Google内部的Borg系统启发并设计的&#xff0c;于2014年作为开源项目首次亮相。 初始阶段 Kubernetes的诞生…...

Java的异常机制

异常机制 三种类型 检查型异常&#xff1a;程序员无法预见的运行时异常&#xff1a;在编译时会被忽略错误ERROR&#xff1a;错误在代码中被忽略&#xff0c;在编译时检查不到 异常处理机制 抛出异常捕获异常异常处理的五个关键字&#xff1a;try&#xff0c;catch&#xff…...

考虑预同步的虚拟同步机T型三电平逆变器并离网MATLAB仿真模型

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 模型简介 三相 T 型三电平逆变器电路如图所示&#xff0c;逆变器主回路由三个单相 T 型逆变器组成。 直流侧输入电压为 UPV&#xff0c;直流侧中点电位 O 设为零电位&#xff0c;交流侧输出侧是三相三线制连…...

记一次k8s取证检材过期的恢复

复盘盘古石k8s的时候碰到了证书过期的问题&#xff0c;在此记录解决方法 报错信息&#xff1a;192.168.91.171:6443 was refused - did you specify the right host or port? 查看证书是否过期 kubeadm alpha certs check-expiration或 openssl x509 -in /etc/kubernetes/…...

量子动态电路中的非破坏性状态快照技术解析

1. 量子动态电路中的非破坏性状态快照技术解析量子计算领域长期面临一个基础性难题&#xff1a;如何在不破坏量子态的前提下获取其状态信息。传统量子态层析&#xff08;QST&#xff09;需要大量相同量子态的副本&#xff0c;且测量过程会导致原始态坍缩。这项由宾夕法尼亚州立…...

特斯拉Model 3无线充电垫DIY:基于Qi标准与3D打印的集成方案

1. 项目概述&#xff1a;为你的特斯拉Model 3打造专属无线充电垫作为一个喜欢在车里折腾点小玩意儿的车主&#xff0c;我总觉得特斯拉Model 3中控台那两个USB-C接口有点不够用&#xff0c;每次上车给手机充电都得插线&#xff0c;线缆还容易在储物格里缠成一团。原厂虽然提供了…...

基于加速度计的体感音乐控制器:用MakeCode与Circuit Playground Express实现交互式乐器

1. 项目概述&#xff1a;当硬件编程遇见音乐创作 如果你对嵌入式开发、物理计算或者音乐技术感兴趣&#xff0c;但又觉得从零开始门槛太高&#xff0c;那么这个项目可能就是为你量身定做的。今天我们来聊聊如何用一块巴掌大的开发板——Adafruit的Circuit Playground Express&a…...

随机化、盲法、匹配:让你的研究更接近“可信因果”——控制额外变量的策略与实验内部效度提升

在科研写作和研究设计中&#xff0c;很多人把注意力放在“用了什么统计方法”上&#xff0c;却忽视了一个更根本的问题&#xff1a;你的研究结果&#xff0c;真的是干预或自变量造成的吗&#xff1f;如果不是&#xff0c;那么即使你的 p 值很小、回归系数显著、模型拟合很好&am…...

[实践|鸿蒙] 从HAP到APP:DevEco Studio编译构建全流程实战解析

1. 鸿蒙应用构建基础&#xff1a;理解HAP与APP的关系 第一次接触鸿蒙应用开发时&#xff0c;我被HAP和APP这两个概念搞得有点懵。经过几个项目的实战&#xff0c;终于搞明白了它们的关系。简单来说&#xff0c;HAP&#xff08;Harmony Ability Package&#xff09;就像乐高积木…...

别再只会调占空比了!STM32F103驱动L298N电机,PWM模式1和模式2到底怎么选?

STM32F103驱动L298N电机&#xff1a;PWM模式1与模式2的深度实战解析 当你在调试L298N电机驱动模块时&#xff0c;是否遇到过这样的困惑&#xff1a;明明设置了相同的占空比&#xff0c;电机却表现出截然不同的响应特性&#xff1f;这背后往往隐藏着PWM模式选择的奥秘。对于STM3…...

为什么龙华选了3DGS?详解高斯泼溅、倾斜摄影、点云在治理场景中的优劣

一、行业核心技术科普&#xff1a;三种主流三维建模技术的原理与定位在城市治理与数字孪生领域&#xff0c;倾斜摄影、点云和3D高斯泼溅&#xff08;3DGS&#xff09;是三种主流的三维建模技术&#xff0c;它们各有侧重&#xff0c;互为补充。倾斜摄影&#xff1a;大范围实景的…...

DLSS版本切换终极指南:掌控游戏性能优化的核心技术

DLSS版本切换终极指南&#xff1a;掌控游戏性能优化的核心技术 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 想要在《赛博朋克2077》中体验更流畅的光追效果&#xff1f;或是让《艾尔登法环》的画面表现更上一层楼&a…...

知识图谱冷启动失败率高达68%?NotebookLM构建中的3类隐性数据断层及实时修复方案

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;NotebookLM知识图谱构建的冷启动困境本质 NotebookLM 作为 Google 推出的基于文档理解的 AI 助手&#xff0c;其核心能力依赖于对用户上传文档构建结构化知识图谱。然而在初始阶段&#xff0c;系统面临…...

百考通AI实践报告:让实习沉淀有迹可循,成长答卷专业呈现

实习实践是连接理论学习与职场实战的桥梁&#xff0c;而一份逻辑清晰、内容详实的实践报告&#xff0c;既是对实习经历的系统复盘&#xff0c;也是个人成长与能力认证的重要载体。然而&#xff0c;许多学生在撰写报告时&#xff0c;常陷入思路混乱、结构松散、重点模糊的困境&a…...