【消息队列开发】 实现消费者订阅消息

news2024/11/18 15:24:42

文章目录

  • 🍃前言
  • 🌳关于订阅消息方法参数解析
  • 🎋如何实现将消息推送给消费者
  • 🎍消费者类
  • 🍀消费消息的流程
  • 🎄如何实现消息确认呢?
  • ⭕总结

🍃前言

本次开发任务

  • 实现消费者订阅消息

🌳关于订阅消息方法参数解析

我们关于订阅消息的方法如下:

在这里插入图片描述

  • consumerTag: 消费者的身份标识
  • autoAck: 消息被消费完成后, 应答的方式. 为 true 自动应答. 为 false 手动应答.
  • consumer: 是一个回调函数,此处类型设定成函数式接口. 这样后续调用 basicConsume 并且传实参的时候, 就可以写作 lambda 样子了
  • queueName:需要订阅消息的队列

在这里插入图片描述

回调函数实现代码如下:

/*
 * 只是一个单纯的函数式接口(回调函数). 收到消息之后要处理消息时调用的方法.
 */
@FunctionalInterface
public interface Consumer {
    // Delivery 的意思是 "投递", 这个方法预期是在每次服务器收到消息之后, 来调用.
    // 通过这个方法把消息推送给对应的消费者.
    void handleDelivery(String consumerTag, BasicProperties basicProperties, byte[] body) throws MqException, IOException;
}

🎋如何实现将消息推送给消费者

消费者订阅消息后,如何将消息推送给消费者呢?

首先我们需要知道一个队列都有那些消费者进行消费,且一个队列的消费者肯定不止一个。

这里博主的做法是,给最初的队列类,加一个集合类的属性,用于储存当前都有那些消费者进行消费

这么多的消费者,那他们应该怎样消费这些消息呢?

这里博主采用轮询的方式进行消费,轮着进行消费就好

以此我们再创建一个属性为 consumerSeq 记录当前取到了第几个消费者. 方便实现轮询策略.

在这里插入图片描述

🎍消费者类

对于消费者,我们创建一个类,并给出基础属性,实现如下:

/*
 * 表示一个消费者(完整的执行环境)
 */
public class ConsumerEnv {
    private String consumerTag;
    private String queueName;
    private boolean autoAck;
    // 通过这个回调来处理收到的消息.
    private Consumer consumer;

    public ConsumerEnv(String consumerTag, String queueName, boolean autoAck, Consumer consumer) {
        this.consumerTag = consumerTag;
        this.queueName = queueName;
        this.autoAck = autoAck;
        this.consumer = consumer;
    }

    public String getConsumerTag() {
        return consumerTag;
    }

    public void setConsumerTag(String consumerTag) {
        this.consumerTag = consumerTag;
    }

    public String getQueueName() {
        return queueName;
    }

    public void setQueueName(String queueName) {
        this.queueName = queueName;
    }

    public boolean isAutoAck() {
        return autoAck;
    }

    public void setAutoAck(boolean autoAck) {
        this.autoAck = autoAck;
    }

    public Consumer getConsumer() {
        return consumer;
    }

    public void setConsumer(Consumer consumer) {
        this.consumer = consumer;
    }
}

🍀消费消息的流程

如果有消息需要进行消费,我们就将该队列放入 一个阻塞队列中,并用一个扫描线程对给该队列进行扫描。若有需要消费的消息队列,就将该队列取出来,交给线程池进行执行信息的回调函数。
在这里插入图片描述
该流程,我们创建一个类ConsumerManager进行实现这些操作:

在这里插入图片描述
该部分代码后面博主再进行书写

🎄如何实现消息确认呢?

我们在执行回调函数之前,先将需要消费的该消息放入待确认的集合中,若执行回调函数没有发生异常与错误,我们就认为消息消费成功。实现了消息确认。

⭕总结

关于《【消息队列开发】 实现消费者订阅消息》就讲解到这儿,感谢大家的支持,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下

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

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

相关文章

公司内部局域网怎么适用飞书?

随着数字化办公的普及,企业对于内部沟通和文件传输的需求日益增长。飞书作为一款集成了即时通讯、云文档、日程管理、视频会议等多种功能的智能协作平台,已经成为许多企业提高工作效率的首选工具。本文将详细介绍如何在公司内部局域网中应用飞书&#xf…

电脑Wi-Fi无法连接如何排查

Wi-Fi是一个神奇的东西,总是能在某一天莫名其妙的连不上让我们疯狂糟心!!! 呉師傅准备了几个解决方法来帮助大家解决连不上Wi-Fi的问题; 1、疑难解答功能 系统自带的【疑难解答】功能不妨试一试,也能一定…

【AAAI 2024】M2Doc:文档版面分析的可插拔多模态融合方法

一、文章介绍 文档版面分析任务是文档智能的一个关键任务。然而,现有的很多文档版面分析研究方法都基于通用目标检测方法,忽视了文档的文本特征而仅仅只关注于视觉特征。近年来,基于预训练的文档智能模型在很多文档下游任务中都取得了成功&a…

左旋字符串功能的实现

实现一个函数,可以左旋字符串中的k个字符。 例如: #1ABCD左旋一个字符得到BCDA #2ABCD左旋两个字符得到CDAB 由此图可知,其字符串长度为4,每次经历四次左旋后又回到了初始 位置,所以是以字符串长度len为一个循环&…

微服务cloud--抱团取暖吗 netflix很多停更了

抱团只会卷,卷卷也挺好的 DDD 高内聚 低耦合 服务间不要有业务交叉 通过接口调用 分解技术实现的复杂性,围绕业务概念构建领域模型;边界划分 业务中台: 数据中台: 技术中台: 核心组件 eureka&#x…

(done) ROC曲线 和 AUC值 分别是什么?

来源:https://www.bilibili.com/video/BV1wz4y197LU/?spm_id_from333.337.search-card.all.click&vd_source7a1a0bc74158c6993c7355c5490fc600 在二分类问题下,我们的模型通常会输出一个 概率值,通过判断 概率值 和 阈值threshold 的大小…

docker 安装部署 jenkins

今天 小☀ 给大家普及一下什么是 jenkins!! Jenkins是一个开源软件项目,基于Java开发的持续集成工具。它提供了一个开放易用的软件平台,使软件项目可以进行持续集成。Jenkins起源于Hudson,主要用于持续、自动地构建、…

动态内存数组(malloc、calloc、realloc、free)

一、为什么要创建动态内存数组 动态内存,顾名思义就是说在内存中非固定的申请数组 在学习该项方法前我们申请内存的方法无非就两种:直接创建变量/通过创建数组的方式来申请空间。 那么直接创建变量/通过创建数组的方式来申请空间的缺点就是一旦创建成…

基于python+vue拍卖行系统的设计与实现flask-django-nodejs-php

拍卖行系统的目的是让使用者可以更方便的将人、设备和场景更立体的连接在一起。能让用户以更科幻的方式使用产品,体验高科技时代带给人们的方便,同时也能让用户体会到与以往常规产品不同的体验风格。 与安卓,iOS相比较起来,拍卖行…

2024学习鸿蒙开发,未来发展如何?

一、前言 想要了解一个领域的未来发展如何,可以从如下几点进行,避免盲从: 国家政策落地情况就业市场如何学习 通过上述三点,就能分析出一个行业的趋势。大家可以看到,我上面的总体逻辑就是根据国家政策来分析未来方…

大数据技术在工厂生产数字转型中的应用与价值

hello宝子们...我们是艾斯视觉擅长ui设计和前端开发10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 随着大数据技术的快速发展,越来越多的企业开始关注并应用大数据技术&#x…

第6讲-MIPS处理器(3)MIPS单周期处理器设计

三. MIPS单周期处理器设计 1.单周期数据通路设计

联合国通过首个全球人工智能决议草案

当地时间3月21日,联合国大会一致通过了全球第一个关于人工智能(AI)的决议草案,以期能够保护个人数据、保障人权,并能有效监控其安全风险。 该决议由美国提出,包括中国在内的其他121个国家共同参与了制定&am…

移动硬盘故障解析:解决无法访问且位置不可用问题

在我们日常的工作和生活中,移动硬盘已成为存储和传输数据的重要工具。然而,有时我们会遇到移动硬盘无法访问且位置不可用的情况,这无疑给数据的存储和访问带来了极大的困扰。本文将深入探讨这一问题,分析其原因,并给出…

提升交付效率:Booking.com 金融技术团队的成功实践

Booking.com 金融技术业务部门的团队对其平台的后端和前端实施了一系列改进措施,并通过 DORA 指标将交付性能提高了一倍。此外,还使用了微前端 (MFE) 模式,将单体 FE 应用程序分解为多个可单独部署的分解应用程序。 2022 年年中,B…

HTML5+CSS3+JS小实例:创意罗盘时钟

实例:创意罗盘时钟 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=…

代码随想录算法训练营第day54|392.判断子序列 、 115.不同的子序列

目录 392.判断子序列 115.不同的子序列 392.判断子序列 力扣题目链接(opens new window) 给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而不改变剩余字符相对位置形成的新字…

《妈妈是什么》笔记(三) 引导孩子做内部自我评价

经典摘录 教孩子如何拒绝 假如你不得不帮助人&#xff0c;请尽力。尽力也包括&#xff0c;用好的态度让不得不求助的人安心&#xff0c;这比帮助还重要。如果你实在不能帮助&#xff0c;也请用好的态度、客观的事实来婉拒&#xff0c;拒绝已经太沉重&#xff0c;如何拒绝&…

详解如何使用Pytest进行自动化测试

为什么需要自动化测试 自动化测试有很多优点&#xff0c;但这里有3个主要的点 可重用性:不需要总是编写新的脚本&#xff0c;除非必要&#xff0c;即使是新的操作系统版本也不需要编写脚本。可靠性:人容易出错&#xff0c;机器不太可能。当运行不能跳过的重复步骤/测试时&…