四、RocketMQ发送普通消息、批量消息和延迟消息
Producer发送普通消息的方式
1.同步发送消息
同步消息代表发送端发送消息到broker之后,等待消息发送结果后,再次发送消息
实现步骤
- 创建生产端,声明在哪个生产组
- 注册NameServer地址
- 构建Message实体,指定topic、tag、body
- 启动生产端
- 发送消息
@Test
public void syncSend() throws MQBrokerException, RemotingException, InterruptedException, MQClientException {// 1.创建生产端,声明在哪个生产组DefaultMQProducer producer = new DefaultMQProducer("test_group");// 2.注册NameServer地址producer.setNamesrvAddr(NAME_SERVER_ADDR);// 3.构建Message实体,指定topic、tag、bodyMessage message = new Message("test", "hello world".getBytes());// 4.启动生产端producer.start();// 5.发送消息SendResult sendResult = producer.send(message);System.out.println(sendResult.getSendStatus());
}
2.异步发送消息
异步消息代表发送端发送完消息后,会直接返回,但是可以注册一个回调函数,当broker将消息落盘后,回调这个回调函数
实现步骤
- 创建生产端,声明在哪个生产组
- 注册NameServer地址
- 构建Message实体,指定topic、tag、body
- 启动生产端
- 发送消息,并且实现SendCallback接口
注:这里必须等待异步返回,否则消费者无法消费成功
@Test
public void asyncSend() throws RemotingException, InterruptedException, MQClientException {DefaultMQProducer producer = new DefaultMQProducer("test_group");producer.setNamesrvAddr(NAME_SERVER_ADDR);Message message = new Message("test", "tag-a","hello world".getBytes());producer.start();CountDownLatch countDownLatch = new CountDownLatch(1);// 发送消息,并且实现SendCallback接口producer.send(message, new SendCallback() {@Overridepublic void onSuccess(SendResult sendResult) {countDownLatch.countDown();System.out.println("发送成功:" + sendResult.getSendStatus());}@Overridepublic void onException(Throwable e) {countDownLatch.countDown();System.out.println("发送失败:" + e);}});countDownLatch.await();
}
3、发送单向消息
发送方只负责发送消息,不等待服务端返回响应且没有回调函数触发,即只发送请求不等待应答。此方式发送消息的过程耗时非常短
实现步骤
- 创建生产端,声明在哪个生产组
- 注册NameServer地址
- 构建Message实体,指定topic、tag、body
- 启动生产端
- 发送单向消息
@Test
public void sendOneWay() throws RemotingException, InterruptedException, MQClientException {DefaultMQProducer producer = new DefaultMQProducer("test_group");producer.setNamesrvAddr(NAME_SERVER_ADDR);Message message = new Message("test","tag-a", "hello world".getBytes());producer.start();producer.sendOneway(message);
}
Producer发送批量消息
在对吞吐率有一定要求的情况下,Apache RocketMQ可以将一些消息聚成一批以后进行发送,可以增加吞吐率,并减少API和网络调用次数。
@Test
public void sendBatch() throws MQClientException, MQBrokerException, RemotingException, InterruptedException {DefaultMQProducer producer = new DefaultMQProducer("test-producer-group");producer.setNamesrvAddr(RocketMQConfig.NAME_SERVER_ADDR);// 构造批量消息List<Message> list = new ArrayList<>();list.add(new Message(RocketMQConfig.TEST_TOPIC, "hello world0".getBytes(Charset.defaultCharset())));list.add(new Message(RocketMQConfig.TEST_TOPIC, "hello world1".getBytes(Charset.defaultCharset())));list.add(new Message(RocketMQConfig.TEST_TOPIC, "hello world2".getBytes(Charset.defaultCharset())));producer.start();// 发送批量消息producer.send(list);producer.shutdown();
}
**注:**需要注意的是批量消息的大小不能超过 1MiB(否则需要自行分割),其次同一批 batch 中 topic 必须相同。
Producer发送延迟消息
Producer想要发送延迟消息,只要设置Message的DelayTimeLevel属性大于0即可。
RocketMQ无法随意设置延迟消息的延迟时间,只能根据延迟级别进行
延迟级别和延迟时间的对应关系
延迟级别 | 延迟时间 | 延迟级别 | 延迟时间 |
---|---|---|---|
1 | 1s | 10 | 6min |
2 | 5s | 11 | 7min |
3 | 10s | 12 | 8min |
4 | 30s | 13 | 9min |
5 | 1min | 14 | 10min |
6 | 2min | 15 | 20min |
7 | 3min | 16 | 30min |
8 | 4min | 17 | 1h |
9 | 5min | 18 | 2h |
@Test
public void sendDelay() throws Exception {DefaultMQProducer producer = new DefaultMQProducer("test-producer-group");producer.setNamesrvAddr(RocketMQConfig.NAME_SERVER_ADDR);producer.start();Message message = new Message(RocketMQConfig.TEST_TOPIC, "hello world".getBytes(Charset.defaultCharset()));// 设置延迟级别message.setDelayTimeLevel(3);// 发送批量消息SendResult sendResult = producer.send(message);System.out.println(sendResult.getSendStatus());producer.shutdown();
}
延迟消息的原理
延迟消息并不会直接发送到指定的topic,而是发送到一个延迟消息对应的topic中
当延迟消息的时间到达后,在将消息发送到指定的topic中
延迟消息投递的流程
-
producer端设置消息delayLevel延迟级别,消息属性DELAY中存储了对应了延时级别
-
broker端收到消息后,判断延时消息延迟级别,如果大于0,则备份消息原始topic,queueId,并将消息topic改为延时消息队列特定topic(SCHEDULE_TOPIC),queueId改为延时级别的delayLevel-1
-
mq服务端ScheduleMessageService中,为每一个延迟级别单独设置一个定时器,定时(每隔1秒)拉取对应延迟级别的消费队列
-
根据消费偏移量offset从commitLog中解析出对应消息
-
从消息tagsCode中解析出消息应当被投递的时间,与当前时间做比较,判断是否应该进行投递
-
若到达了投递时间,则构建一个新的消息,并从消息属性中恢复出原始的topic,queueId,并清除消息延迟属性,从新进行消息投递
相关文章:

四、RocketMQ发送普通消息、批量消息和延迟消息
Producer发送普通消息的方式 1.同步发送消息 同步消息代表发送端发送消息到broker之后,等待消息发送结果后,再次发送消息 实现步骤 创建生产端,声明在哪个生产组注册NameServer地址构建Message实体,指定topic、tag、body启动…...

idea自定义 postfix completion提高编码效率
postfix completion的使用 详情见: https://www.cnblogs.com/expiator/p/17380495.html 自定义 postfix completion List、 String 初始化list: key: list表达式: List<$EXPR$> $END$List new ArrayList<>();字符串判空&…...

解锁学习电路设计的正确姿势!
...

【Linux】 ps命令使用
作为一个后端的程序员,我们经常用到ps -ef | grep XXX 到底什么事ps呢。 下面我们一起学习一下吧、 ps (英文全拼:process status)命令用于显示当前进程的状态,类似于 windows 的任务管理器。 ps命令 -Linux手册页 …...

打造高效的分布式爬虫系统:利用Scrapy框架实现
在大数据时代的今天,爬虫系统成为了获取和分析海量数据的重要工具。本文将介绍如何使用Scrapy框架来构建一个高效的分布式爬虫系统,以加速数据采集过程和提高系统的可扩展性。 Scrapy框架简介 Scrapy是一个基于Python的强大的开源网络爬虫框架ÿ…...

SpringCloud组件Ribbon的IRule的问题排查
最近很久没有写文章啦,刚好遇到了一个问题,其实问题也挺简单,但是还是得对源码有一定了解才能够发现。 最近在实现一个根据请求流量的标签,将请求转发到对应的节点,其实和俗称的灰度请求有点相似, 实现思…...

比较完整一些chatGPT项目代码(权威)
https://gitee.com/zccbbg/chatgpt-springboot-service yml中的配置文件无法读取,前端访问比较困难。...

Python - 生成二维码、条形码
二维码 import qrcode# 要生成的文本或链接 data "要生成的文本或链接"# 创建QR码对象 qr qrcode.QRCode(version1, # 版本号,通常设置为1error_correctionqrcode.constants.ERROR_CORRECT_L, # 错误修正级别box_size10, # 每个小方块的像素大小bor…...

8+纯生信,多组机器学习+分型探讨黑色素瘤发文思路。
今天给同学们分享一篇泛癌多组机器学习分型的生信文章“Comprehensive characterisation of immunogenic cell death in melanoma revealing the association with prognosis and tumor immune microenvironment”,这篇文章于2022年9月23日发表在Front Immunol 期刊…...

GPU高性能面试-写一个ReduceKernel
要求写一个reduceKernel 要求给出Kerne的完整调用: 1. 进行一维reduce 可以写一个最基础的,仅仅实现基础功能就行 使用share mem进行功能优化 使用shuffles指令完成block reduce操作 2.实现二维reduce...

深入探索STARK的安全性和可靠性——STARKs全面安全分析
1. 引言 non-interactive STARKs,起源于Interactive Oracle Proofs (IOPs),然后通过random oracle模式转换为非交互式。StarkWare团队 ethSTARK Documentation – Version 1.2(2023年7月)论文做了更新,给出了完整具体…...

WPF 控件分辨率自适应问题
WPF 控件分辨率自适应时,我首先想到的是使用ViewBox控件来做分辨率自适应。 ViewBox这个控件通常和其他控件结合起来使用,是WPF中非常有用的控件。定义一个内容容器。ViewBox组件的作用是拉伸或延展位于其中的组件,以填满可用空间࿰…...

CANoe创建仿真工程
CANoe创建仿真工程 写在前面仿真工程的创建创建工程添加CAN数据库添加系统变量创建面板创建网络节点为节点添加代码工程运行测试总结 写在前面 Canoe的安装不是特别方便,我是参加了松勤的培训课程,不仅需要安装软件还需要安装驱动,刚刚学习的…...

Scanner 输入回车跳不出循环的解决方法
题目要求: 输入一行内容包含字符串和数字,将字符串与数字分别提取。 解决方法: 可以使用两个Scanner对象,一个用来键入数据,另外一个用来对数据进行操作,以此来解决输入“回车”跳不出while循环的问题。 i…...

docker 启动 mysql 通过防火墙设置端口无法访问解决方案
1、问题描述:通过 docker compose 启动mysql服务,然而在防火墙添加了3306端口后却无法访问,但是关闭防火墙后又可以访问mysql数据库。 解决方案: 重启 docker 后解决:systemctl restart docker 如果没有解决问题则执…...

智能制造优化,RFID生产线管理系统解决方案
一、背景介绍 随着全球经济的发展,传统制造业面临着越来越高的成本和低利润的挑战,为了提升企业的整体利润率,优化管理流程成为必要的手段之一,在传统的制造企业中,生产线通常采用单件流生产模式,但这种模…...

【Mybatis】基于Mybatis插件+注解,实现敏感数据自动加解密
一、介绍 业务场景中经常会遇到诸如用户手机号,身份证号,银行卡号,邮箱,地址,密码等等信息,属于敏感信息,需要保存在数据库中。而很多公司会会要求对数据库中的此类数据进行加密存储。 敏感数据…...

【特纳斯电子】基于物联网的指纹密码锁系统设计-实物设计
资料下载链接:基于物联网的指纹密码锁系统设计-实物设计 - 电子校园网 编号: T3732205M-SW 设计简介: 本设计是基于单片机的指纹密码锁,主要实现以下功能: 1、可通过密码解锁 2、可通过云平台解锁 3、可通过指纹解…...

【牛客面试必刷TOP101】Day9.BM37 二叉搜索树的最近公共祖先和BM42 用两个栈实现队列
作者简介:大家好,我是未央; 博客首页:未央.303 系列专栏:牛客面试必刷TOP101 每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!!&…...

10.12 校招 实习 内推 面经
绿*泡*泡: neituijunsir 交流裙 ,内推/实习/校招汇总表格 1、校招 | 2024届秋招,美团哪些校招岗位最缺人?(内推) 校招 | 2024届秋招,美团哪些校招岗位最缺人?(内推&…...

redis 生成流水工具类
使用redis存储流水号,代码如下: import cn.hutool.core.date.DateUtil; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component;Component public class RedisSerialUtil {private RedisTemplate…...

BGP服务器租用腾讯云和阿里云价格对比
BGP云服务器像阿里云和腾讯云均是BGP多线网络,速度更快延迟更低,阿里云BGP服务器2核2G3M带宽优惠价格108元一年起,腾讯云BGP服务器2核2G3M带宽95元一年起,阿腾云atengyun.com分享更多云服务器配置如2核4G、4核8G、8核16G等配置价格…...

PyTorch 深度学习之多分类问题Softmax Classifier(八)
1. Revision: Diabetes dataset 2. Design 10 outputs using Sigmoid? 2.1 Output a Distribution of prediction with Softmax 2.2 Softmax Layer Example, 2.3 Loss Function-Cross Entropy Cross Entropy in Numpy Cross Entropy in PyTorch 注意交叉熵损失,最…...

抖音直播招聘小程序可以增加职位展示,提升转化率,增加曝光度
抖音直播招聘报白是指进入抖音的白名单,允许在直播间或小视频中发布招聘或找工作等关键词。否则会断播、不推流、限流。抖音已成为短视频流量最大的平台,但招聘企业数量较少。抖音招聘的优势在于职位以视频、直播方式展示,留存联系方式更加精…...

论文阅读之《Learn to see in the dark》
Learning to See in the Dark-CVPR2018 Chen ChenUIUC(伊利诺伊大学厄巴纳-香槟分校) Qifeng Chen, Jia Xu, Vladlen Koltun Intel Labs(英特尔研究院) 文章链接:https://arxiv.org/pdf/1805.01934.pdfhttps://arxiv.org/pdf/1805.01934.p…...

Docker 生成自定义镜像并使用Docker Compose部署
Docker 生成自定义镜像并使用Docker Compose部署 Docker Compose 是一个用于定义和运行多个 Docker 容器的工具,可以轻松管理复杂的应用程序。本文将介绍如何在 Docker Compose 中使用自定义 Docker 镜像,并提供了生成自定义 Docker 镜像的步骤。 步骤…...

设计模式~调停者(中介者)模式(Mediator)-21
调停者(中介者)模式(Mediator) (1)优点 (2)缺点 (3)使用场景 (4)注意事项: (5)应用实例: 代码 调停者&a…...

计算机毕业设计选什么题目好?springboot 医院门诊在线预约挂号系统
✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…...

linux中使用ps查看进程的所有线程
在 Linux 系统中,可以使用 ps 命令和 ps H 命令结合来查看进程的线程信息。ps 命令用于显示系统中当前运行的进程信息,而 ps H 命令则可以显示进程中的所有线程。 使用以下命令可以查看指定进程的所有线程信息: ps H -T <PID>将 替换…...

本、硕、博区别真的辣么大吗?
61: 发际线已经说明了一切…… Super Mario: 小学,老师告诉学生:“森林里有只老虎,已经被我关在笼子里,我会带你去那个地方,然后给你一把猎枪,告诉你猎枪怎么用,并开枪…...