微服务框架 SpringCloud微服务架构 服务异步通讯 51 死信交换机 51.2 TTL

news2024/11/24 4:28:51

微服务框架

【SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】

服务异步通讯

文章目录

      • 微服务框架
      • 服务异步通讯
      • 51 死信交换机
        • 51.2 TTL
          • 51.2.1 TTL
          • 51.2.2 总结

51 死信交换机

51.2 TTL

51.2.1 TTL

TTL,也就是Time-To-Live。【存活时间】

如果一个队列中的消息TTL结束仍未消费,则会变为死信,ttl超时分为两种情况:

  • 消息所在的队列设置了存活时间
  • 消息本身设置了存活时间

【举个栗子】

在这里插入图片描述

生产者 → 交换机 → 队列 → 死信交换机 → 死信队列

现在有了一个消息

在这里插入图片描述

这个消息它 自己设置了 TTL ,为 5000ms,当消息发出,到达 ttl.queue 队列的那一刻,

在这里插入图片描述

它就会开始 倒计时,倒计时结束,

在这里插入图片描述

这个消息就变成 了死信

在这里插入图片描述

从而 投递到死信交换机,最终到达 死信队列

这个时候如果恰好 有一个消费者 在监听着 死信队列

在这里插入图片描述

那它肯定就能收到这个消息了

从整个流程看来,就变成了 生产者发送了 一个消息,5 s 中后消费者才拿到【就实现了一个延迟投递的效果】

当然除了给 消息设置TTL ,也可以给队列设置TTL,

在这里插入图片描述

10 s。如果消息和队列 都有自己的TTL,这个时候就会依较小 的。

【试试】

我们声明一组死信交换机和队列,基于注解方式:

在这里插入图片描述

要给队列设置超时时间,需要在声明队列时配置x-message-ttl属性:

在这里插入图片描述

【实现】

修改监听类

    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(name = "dl.queue",durable = "true"),
            exchange = @Exchange(name = "dl.direct"),
            key = "dl"
    ))
    public void listenDlQueue(String msg){
        log.info("消费者接收到了 dl.queue的延迟消息");
    }

在这里插入图片描述

再来一个新的配置类

package cn.itcast.mq.config;

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

/**
 * ClassName: TTLMessageConfig
 * date: 2022/11/9 19:51
 *
 * @author DingJiaxiong
 */

@Configuration
public class TTLMessageConfig {

    @Bean
    public DirectExchange ttlDirectExchange() {
        return new DirectExchange("ttl.direct");
    }

    @Bean
    public Queue ttlQueue() {
        return QueueBuilder
                .durable("ttl.queue")
                .ttl(10000)
                .deadLetterExchange("dl.direct")
                .deadLetterRoutingKey("dl")
                .build();
    }

    @Bean
    public Binding ttlBinding(){
        return BindingBuilder.bind(ttlQueue()).to(ttlDirectExchange()).with("ttl");
    }

}

OK, 启动消费者

在这里插入图片描述

OK,启动成功

测试,在生产者里面来一个测试方法

@Test
public void testTTLMessage() {

    //1. 准备消息
    Message message = MessageBuilder.withBody("Hello,ttl message".getBytes(StandardCharsets.UTF_8))
            .setDeliveryMode(MessageDeliveryMode.PERSISTENT)
            .build();

    //2. 发送消息
    rabbitTemplate.convertAndSend("ttl.direct","ttl",message);
    //3. 记录日志,方便查看时间
    log.info("消息已经成功发送了!");
}

直接运行测试

在这里插入图片描述

OK,注意这个时间

查看消费者的日志

在这里插入图片描述

几乎刚好10 s,牛逼!!!!!!!

这是基于队列,给队列设置的延迟时间 为 10s

再给消息设置一手

【发送消息时,给消息本身设置超时时间】

在这里插入图片描述

在这里插入图片描述

OK,再次运行测试

在这里插入图片描述

注意这个时间

OK,查看消费者日志

在这里插入图片描述

5s 没毛病,即队列和消息都设置了 超时时间时,以较短的为准

51.2.2 总结

消息超时的两种方式是?

  • 给队列设置ttl属性,进入队列后超过ttl时间的消息变为死信
  • 给消息设置ttl属性,队列接收到消息超过ttl时间后变为死信
  • 两者共存时,以时间短的ttl为准

如何实现发送一个消息20秒后消费者才收到消息?

  • 给消息的目标队列指定死信交换机
  • 消费者监听与死信交换机绑定的队列
  • 发送消息时给消息设置ttl为20秒

牛逼!!!!!!!

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

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

相关文章

如何使用vs code远程连接服务器?如何免密登录?VSCode SSH

依旧是写在前面的废话环节 背景: 计算机专业。实验室电脑情况:两台服务器,一台配置3029ti,一台配置2080ti。深度学习训练跑代码用自己的电脑远程连接服务器,进行代码运行。 用到的软件: visual studio c…

vue3+vite+ts项目集成科大讯飞语音识别(项目搭建过程以及踩坑记录)

🐱个人主页:不叫猫先生 🙋‍♂️作者简介:前端领域新星创作者、华为云享专家、阿里云专家博主,专注于前端各领域技术,共同学习共同进步,一起加油呀! 💫系列专栏&#xff…

Web前端105天-day48-jQuery

jQuery01 目录 前言 一、复习 二、jQuery 三、css操作 四、点击事件 五、class 六、show_hide 七、标签栏切换 八、自定有动画 九、属性操作 十、大小图切换 总结 前言 jQuery01学习开始 一、复习 DOM: 文档 对象 模型 HTML代码 转换成 document 对象, 然后再渲染…

ospf,三层交换机,热备,以太网通道练习实验(含命令)

♥️作者:小刘在这里 ♥️每天分享云计算网络运维课堂笔记,疫情之下,你我素未谋面,但你一定要平平安安,一 起努力,共赴美好人生! ♥️夕阳下,是最美的,绽放,…

Sikuli循环执行点击图标的脚本

首先需要sikulix jar包 新建java项目 导入sikulix jar包 编写代码如下 这样电脑每隔一段时间就会去点击一下c.png这个图标 package one; import org.sikuli.script.Screen; public class clickMouse { public static void main(String[] args) throws Exception { …

人力资本管理(HCM)软件的主要好处是什么?

人力资本管理(HCM)包括企业在招聘、雇用和培训期间为优化生产力采取的所有流程。为了最大限度地发挥团队的作用,留住顶尖人才,管理者和领导者需要投资于适当的实践和资源。实现这一目标的方法之一是通过人力资本管理。 作为一套…

js中数组是如何在内存中存储的?

数组不是以一组连续的区域存储在内存中,而是一种哈希映射的形式。它可以通过多种数据结构来实现,其中一种是链表。 js分为基本类型和引用类型: 基本类型是保存在栈内存中的简单数据段,它们的值都有固定的大小,保存在…

【FFmpeg+Qt】视频进度条控制——点击跳转和拖动跳转

首先进度条采用Qslider,设置进度条主要有两点,一是当前视频总时长,二是当前播放时长,需要通过FFmpeg转码成mp4文件才能获取相应的时长数据; 往期回顾: 【QtFFmpeg】视频转码详细流程_logani的博客-CSDN博…

从用户测试中学到的知识

从客户那里获得良好的反馈是个挑战。用户测试有的时候看起来是一个艰巨而且昂贵的任务。但是用户测试可以带来良好的经验,从而帮助设计更好的产品。 那么,从哪里开始呢?我测试了几种方法,有些失败,有些成功。下面我将讲述我所学到…

基于JAVA的教学进度在线管理系统/教学大纲在线管理系统源代码+数据库,含详细项目需求分析、概要设计、详细设计及项目总结文档

项目启动步骤 使用 SQL_Scripts/tms.sql 中的 sql 语句创建数据库与数据库表(数据库建立中,暂无) 修改 src/a_little_config.txt 文件,填入正确的数据库连接用户名、密码 将项目导入 IntelliJ IDEA 或 eclipse。 打开 cn.findix.tms.bin 包下的 WWW 文…

C#使用随机数模拟器来模拟世界杯排名(三)

接上篇 C#使用随机数模拟器来模拟世界杯排名(二)_斯内科的博客-CSDN博客 上一篇我们使用随机数匹配比赛的世界杯国家, 这一篇我们使用随机数以及胜率模拟器 决赛出 世界杯冠军、亚军。 我们在主界面 新增按钮【开始比赛 直到 决出冠军】和【刷新重新随机分配】 …

Python语言程序设计实验报告

第二章:Python变量与数据类型 一、实验目的: 1.了解Python变量的概念与相关含义; 2.学习Python中的数据类型; 二、实验环境: 1.笔记本电脑 2.PyCharm Community Edition 2022.2.3工具 三、实验内容: 1.将字…

ZABBIX6.0LTS安装笔记

一、准备好干净的操作系统 推荐使用:Rocky Linux 8.6 二、安装ZABBIX 官网:https://www.zabbix.com/cn/download 【1】选择您Zabbix服务器的平台 【2】 安装Zabbix包 下载安装包源 # rpm -Uvh https://repo.zabbix.com/zabbix/6.0/rhel/8/x86_64/zabb…

Spring的动态AOP源码解析

一… 引入 1.1 概念 1.2 注解方式使用AOP @Aspect public class LogAspects {/*** 1. 本类引用,只需要写方法名* 2. 其他类引用,需要写路径*/@Pointcut("execution(public int com.floweryu.aop.MathCalculator.*(..))")public void pointCut

Linux--进程间通信

目录1. 进程间通信目的2. 管道2.1 管道特性(匿名管道)2.1.1 单向通信2.1.2 面向字节流2.2 管道的大小2.3 命名管道3. system V进程间通信3.1 shmget函数3.1.1 key VS shmid3.2 shmctl函数3.3 shmat函数 VS shmdt函数:3.4 测试4. 感性认识4.1 …

R语言中的多类别问题的绩效衡量:F1-score 和广义AUC

最近我们被客户要求撰写关于分类的研究报告,包括一些图形和统计输出。对于分类问题,通常根据与分类器关联的混淆矩阵来定义分类器性能。根据混淆矩阵 ,可以计算灵敏度(召回率),特异性和精度。 对于二进制…

基于javaweb物业管理系统的设计与实现/小区物业管理系统

摘 要 随着世界经济快速的发展,全国各地的城市规模不断扩大,住进城市的人口日益增多,房地产行业在现代社会的发展中有着重要的作用,有越来越多的人居住在小区里。 因此,一套高效并且无差错的物业管理系统软件在现代社会…

基于Android的校园一卡通App平台

演示视频信息: A6604基于Android的校园一卡通一、研究背景、目的及意义 (一)研究背景 二十一世纪是信息化的时代,信息化建设成为我们的首要任务。当前我国大力发展信息产业,在全国范围内各行各业开始实施信息化…

为什么要上机械制造业ERP系统?对企业有什么帮助?

在日益竞争激烈的市场背景下,机械制造企业提供的产品需要具有更短的交货期、更高的质量、更好的服务。而机械行业由于其工艺复杂的生产特点,工艺及在制品管理困难,单纯的靠手工记账处理,已经难以满足现代企业科学管理的需要。只有…

艾美捷IFN-gamma体内抗体参数及应用

艾美捷IFN-gamma体内抗体背景: 干扰素γ(IFN-γ)或II型干扰素是一种二聚可溶性细胞因子,是II型干扰素的唯1成员。它是一种细胞因子,对抵抗病毒和细胞内细菌感染的先天性和适应性免疫以及肿瘤控制至关重要。IFNG主要由…