RabbitMQ延时队列(实现定时任务)

消息的TTL(Time To Live)就是消息的存活时间。

RabbitMQ可以对队列和消息分别设置TTL。

对队列设置存活时间,就是队列没有消费者连着的保留时间。

对每一个单独的消息单独的设置存活时间。超过了这个时间,我们认为这个消息就死了,称之为死信。

如果队列设置了TTL,消息也设置了,那么会取小的。所以一个消息如果被路由到不同的队列中,这个消息死亡的时间有可能不一样(不同的队列设置)。这里单讲单个消息的TTL,因为它才是实现延迟任务的关键。可以通过设置消息的expiration字段或者xmessage-ttl属性来设置时间,两者是一样的效果。

死信路由 

一个消息在成为死信后,会进死信路由。

记住这里是路由而不是队列,一个路由可以对应很多队列。(什么是死信)

普通消息成为死信的条件:死信将被路由到死信交换机、再路由到普通队列,普通队列发送消息给消费者。

被拒收的消息:一个消息被Consumer拒收了,并且reject方法的参数里requeue是false。也就是说不会被再次放在队列里,被其他消费者使用。(basic.reject/ basic.nack)requeue=false
TTL到期的消息:

消息的TTL到了,消息过期了。被队列丢弃的消息:

队列的长度限制满了。排在前面的消息会被丢弃或者扔到死信路由上

死信交换机 

死信交换机Dead Letter Exchange其实就是一种普通的exchange,和创建其他exchange没有两样。只是在某一个设置Dead Letter Exchange的队列中有消息过期了,会自动触发消息的转发,发送到Dead Letter Exchange中去。

延时队列 

先设置消息在TTL后变成死信,再设置队列里死信统一被路由到一个指定的交换机,那个指定的交换机专门处理死信,达成延时队列的效果。

手动ack&异常消息统一放在一个队列处理建议的两种方式

catch异常后,手动发送到指定队列,然后使用channel给rabbitmq确认消息已消费

给Queue绑定死信队列,使用nack(requque为false)确认消息消费失败

 
 

/*** 创建队列,交换机,延迟队列,绑定关系 的configuration* 不会重复创建覆盖* 1、第一次使用队列【监听】的时候才会创建* 2、Broker没有队列、交换机才会创建*/
@Configuration
public class MyRabbitMQConfig {//    @RabbitHandler
//    public void listen(Message message){
//        System.out.println("收到消息:------>"+message);
//    }/*** 延时队列* @return*/@Beanpublic Queue orderDelayQueue(){HashMap<String, Object> arguments = new HashMap<>();/*** x-dead-letter-exchange :order-event-exchange 设置死信路由* x-dead-letter-routing-key : order.release.order 设置死信路由键* x-message-ttl :60000*/arguments.put("x-dead-letter-exchange","order-event-exchange");arguments.put("x-dead-letter-routing-key","order.release.order");arguments.put("x-message-ttl",30000);Queue queue = new Queue("order.delay.queue", true, false, false,arguments);return queue;}/*** 死信队列* @return*/@Beanpublic Queue orderReleaseQueue(){Queue queue = new Queue("order.release.order.queue",true,false,false);return queue;}/*** 死信路由[普通路由]* @return*/@Beanpublic Exchange orderEventExchange(){/**   String name,*   boolean durable,*   boolean autoDelete,*   Map<String, Object> arguments* */TopicExchange topicExchange = new TopicExchange("order-event-exchange",true,false);return topicExchange;}/*** 交换机与延时队列的绑定* @return*/@Beanpublic Binding orderCreateOrderBinding(){/** String destination, 目的地(队列名或者交换机名字)* DestinationType destinationType, 目的地类型(Queue、Exhcange)* String exchange,* String routingKey,* Map<String, Object> arguments* */Binding binding = new Binding("order.delay.queue",Binding.DestinationType.QUEUE,"order-event-exchange","order.create.order",null);return binding;}/*** 死信路由与普通死信队列的绑定* @return*/@Beanpublic Binding orderReleaseOrderBinding(){Binding binding = new Binding("order.release.order.queue",Binding.DestinationType.QUEUE,"order-event-exchange","order.release.order",null);return binding;}
}

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

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

相关文章

代码随想录算法训练营:19/60

非科班学习算法day19 | LeetCode530:二叉搜索树的最小绝对差 &#xff0c;Leetcode501:二叉搜索树的众数 &#xff0c;Leetcode236:二叉树的最近公共祖先 目录 介绍 一、LeetCode题目 1.LeetCode530:二叉搜索树的最小绝对差 题目解析 2.Leetcode501: 二叉搜索树的众数 …

软设之加工逻辑之结构化语言

结构化语言是一种介于自然语言和形式化语言之间的半形式语言&#xff0c;是自然语言的一个受限子集 外层&#xff1a;用来描述控制结构&#xff0c;采用顺序&#xff0c;选择和重复3种基本结构 1.顺序结构&#xff1a;一组祈使语句&#xff0c;选择语句&#xff0c;重复语句的…

个人对JVM的一点理解

JVM&#xff08;Java 虚拟机&#xff09;是 Java 程序能够跨平台运行的关键。它负责将 Java 字节码转换为机器码并执行。 JVM 主要由类加载器、运行时数据区、执行引擎和本地方法接口等部分组成。运行时数据区包括方法区、堆、虚拟机栈、本地方法栈和程序计数器等。 GC&#xf…

远期利率(Forward Rate)是什么?以及远期利率在期货合约中的应用

远期利率是什么&#xff1f; 中文版 远期利率&#xff08;Forward Rate&#xff09;是指从未来某一时间段开始适用的利率。它是金融市场上的一种合约利率&#xff0c;表示在某个特定日期开始的一段时间内的预期利率。这种利率可以通过现有的即期利率&#xff08;Spot Rate&am…

6.26考试前总结

一、选择 1、运算符重载&#xff1a;&#xff08;1&#xff09;不可重载&#xff1a;. .* :: ?: sizeof &#xff08;2&#xff09;只成员函数&#xff1a;、[]、&#xff08;&#xff09;、-> ps:和[]需要加&&#xff0c;返回类&#xff0c;[]返回中括号内…

SpringBoot根据不同IP限制接口的QPS

根据对方IP地址来限制接口的QPS&#xff08;每秒查询率&#xff09;&#xff0c;你可以结合Spring Boot应用、Guava的RateLimiter或者自定义的并发控制逻辑来实现。以下是一个基于Guava RateLimiter和Spring Boot的示例&#xff0c;展示如何根据IP地址来限制接口的QPS&#xff…

镜头下的光学

说实话&#xff0c;当我看到几何光学的内容全是初中的解析几何的时候&#xff0c;我就觉得讲的方式太原始了&#xff0c;而且太过复杂也看不懂。所以我尝试做了数学建模&#xff0c;发现建模之后模型可以解释一些物理现象&#xff0c;也不会有矛盾的地方&#xff0c;那就算过得…

【Python系列】探索 Python 环境管理工具:conda 与 pip 的比较

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

简过网:专科生可以考的编制岗位有哪些?这5个铁饭碗要抓住了!

专科生可以考的编制岗位有哪些&#xff1f;以下这几种可以考的&#xff0c;尤其是应届毕业生&#xff0c;一定要抓住机会哦&#xff01; ​ 一、三支一扶&#xff1a;专科生可报考&#xff0c;期满可转编。 三支一扶&#xff1a;支农、支医生、支教、扶贫 工作时间一般为2年&…

深入探索Postman:前置与后置脚本的编写与应用

Postman是一款广受欢迎的API开发和测试工具&#xff0c;它提供了丰富的功能来简化接口测试过程。在Postman中&#xff0c;前置脚本&#xff08;Pre-request Script&#xff09;和后置脚本&#xff08;Tests Script&#xff09;是两个强大的功能&#xff0c;允许用户在发送请求之…

秋招Java后端开发冲刺——非关系型数据库篇(Redis)

一、非关系型数据库 1. 主要针对的是键值、文档以及图形类型数据存储。 2. 特点&#xff1a; 特点说明灵活的数据模型支持多种数据模型&#xff08;文档、键值、列族、图&#xff09;&#xff0c;无需预定义固定的表结构&#xff0c;能够处理各种类型的数据。高扩展性设计为水…

安全技术和防火墙(一)

安全技术和防火墙 安全技术 入侵检测系统&#xff1a;特点是不阻断网络访问&#xff0c;主要提供报警和事后监督 不主动介入 (监控) 入侵防御系统&#xff1a;透明模式工作 &#xff0c;数据包,网络监控,服务攻击,木马,蠕虫,系统漏洞 等 进行准确的分析判断 判断为攻击行为后会…

高校心理咨询管理系统

摘 要 随着高校学生心理问题的增多&#xff0c;心理咨询服务在高校中的重要性日益凸显。然而&#xff0c;传统的心理咨询管理方式存在着诸多问题&#xff0c;如信息不透明、咨询师资源不足等。为了解决这些问题&#xff0c;本文设计并实现了一种基于Java Web的高校心理咨询管理…

model_json_schema

model_json_schema示列 from pydantic import BaseModel, Field, ValidationError, field_validatorclass User(BaseModel):id: int Field(default0, lt100, gt0)username: stremail: strfield_validator(username)def name_must_alpha(cls, v):assert v.isalpha(), name mus…

浸式冷却设计参数

每天一篇行业发展资讯&#xff0c;让大家更及时了解外面的世界。 更多资讯&#xff0c;请关注B站/公众号【莱歌数字】&#xff0c;有视频教程~~ 两相被动浸入冷却是指使用改变相的沸腾液体来去除一个或多个表面的热量的冷却系统。 然后蒸汽被移动到冷凝器&#xff0c;然后被…

LaTeX中添加矩阵分块虚线并设置虚线疏密

对于大型矩阵&#xff0c;有时需要添加分块虚线。 方法为使用arydshln宏包&#xff0c;然后在array环境中设置虚线。需要注意的是&#xff0c;使用矩阵环境需要搭配amsmath宏包使用&#xff0c;且需放在amsmath宏包之后。即导言区设置为 \usepackage{amsmath} \usepackage{ary…

日语培训日语等级考试柯桥小语种学习语言学校

什么是外来语 外来语是指在日本的国语中使用的来源于外国语言的词汇。但狭义上的外来语则是指来源于欧美国家语言的词汇&#xff0c;其中大部分是来源于英美语系的词汇。日语中的汉语词汇很多&#xff0c;大多是自古以来从中国引进的&#xff0c;从外来语的定义看&#xff0c;汉…

NLP逻辑层次模型|跳出局限,站在更高维度认识自己

什么是NLP逻辑层次模型 N-Neuro&#xff1a;指神经系统&#xff0c;包括生理基础&#xff08;大脑&#xff09;和思维运作过程 L-Linguistic&#xff1a;指语言&#xff0c;感觉信号输出——构成意思的过程 P-Programming&#xff1a;指程序&#xff0c;大脑产生某结论后要具体…

【干货】Vue3 组件通信方式详解

前言 毫无疑问&#xff0c;组件通信是Vue中非常重要的技术之一&#xff0c;它的出现能够使我们非常方便的在不同组件之间进行数据的传递&#xff0c;以达到数据交互的效果。所以&#xff0c;学习组件通信技术是非常有必要的&#xff0c;本文将总结Vue中关于组件通信的八种方式…

代码随想录算法训练营DAY49|300.最长递增子序列、 674. 最长连续递增序列、718. 最长重复子数组

300.最长递增子序列 题目链接&#xff1a;300.最长递增子序列dp初始化为1&#xff08;最小子序列长度为1&#xff09; class Solution(object):def lengthOfLIS(self, nums):""":type nums: List[int]:rtype: int"""dp [1]*len(nums)result …