尚硅谷rabbitmq 2024 流式队列2024指定偏移量 第55节答疑
rabbitmq的stream:
4、对比
autoTrackingstrategy方式:始终监听Stream中的新消息(狗狗看家,忠于职守)指定偏移量方式:针对指定偏移量的消息消费之后就停止(狗狗叼飞盘,回来就完)
这两种分别怎么写?java
在 RabbitMQ 中,Stream 是一种新的消息传递机制,允许高吞吐量和低延迟的消息传递。你提到的两种消费方式分别是自动跟踪策略(Auto Tracking Strategy)和指定偏移量(Offset)的消费方式。下面我们将分别演示这两种方式的 Java 实现。
### 1. 自动跟踪策略(Auto Tracking Strategy)
这种方式下,消费者会一直监听 Stream 中的新消息,并不断处理这些消息。
#### 示例代码
```java
import com.rabbitmq.stream.Consumer;
import com.rabbitmq.stream.Environment;
import com.rabbitmq.stream.Message;
import com.rabbitmq.stream.OffsetSpecification;
import com.rabbitmq.stream.ConsumerBuilder;
public class AutoTrackingConsumer {
public static void main(String[] args) {
Environment environment = Environment.builder().host("localhost").build();
String streamName = "test_stream";
// 创建消费者
Consumer consumer = environment.consumerBuilder()
.stream(streamName)
.offset(OffsetSpecification.first()) // 从第一个消息开始
.messageHandler((context, message) -> {
String body = new String(message.getBodyAsBinary());
System.out.println("Received message: " + body);
})
.build();
// 消费者会一直运行,监听新的消息
System.out.println("Consumer is listening for new messages...");
}
}
```
### 2. 指定偏移量(Offset)的消费方式
这种方式下,消费者会从指定的偏移量开始消费消息,并在消费完这些消息后停止。
#### 示例代码
```java
import com.rabbitmq.stream.Consumer;
import com.rabbitmq.stream.Environment;
import com.rabbitmq.stream.Message;
import com.rabbitmq.stream.OffsetSpecification;
import com.rabbitmq.stream.ConsumerBuilder;
public class OffsetConsumer {
public static void main(String[] args) {
Environment environment = Environment.builder().host("localhost").build();
String streamName = "test_stream";
long offset = 10; // 指定偏移量
// 创建消费者
Consumer consumer = environment.consumerBuilder()
.stream(streamName)
.offset(OffsetSpecification.offset(offset)) // 从指定偏移量开始
.messageHandler((context, message
============
为什么没写.autoTrackingStrategy()?
你提到的 `.autoTrackingStrategy()` 是 RabbitMQ Stream API 中的一个重要方法,它用于指定消费者的自动跟踪策略。让我们详细解释一下如何在代码中使用这个方法。
### 自动跟踪策略(Auto Tracking Strategy)
自动跟踪策略允许消费者始终监听 Stream 中的新消息,并自动跟踪消息的偏移量。这种方式下,消费者会持续消费新消息,而不会停止。
#### 示例代码
```java
import com.rabbitmq.stream.Consumer;
import com.rabbitmq.stream.Environment;
import com.rabbitmq.stream.Message;
import com.rabbitmq.stream.OffsetSpecification;
import com.rabbitmq.stream.ConsumerBuilder;
public class AutoTrackingConsumer {
public static void main(String[] args) {
Environment environment = Environment.builder().host("localhost").build();
String streamName = "test_stream";
// 创建消费者
Consumer consumer = environment.consumerBuilder()
.stream(streamName)
.offset(OffsetSpecification.first()) // 从第一个消息开始
.autoTrackingStrategy() // 启用自动跟踪策略
.messageHandler((context, message) -> {
String body = new String(message.getBodyAsBinary());
System.out.println("Received message: " + body);
})
.build();
// 消费者会一直运行,监听新的消息
System.out.println("Consumer is listening for new messages...");
}
}
```
### 指定偏移量(Offset)的消费方式
这种方式下,消费者会从指定的偏移量开始消费消息,并在消费完这些消息后停止。
#### 示例代码
```java
import com.rabbitmq.stream.Consumer;
import com.rabbitmq.stream.Environment;
import com.rabbitmq.stream.Message;
import com.rabbitmq.stream.OffsetSpecification;
import com.rabbitmq.stream.ConsumerBuilder;
public class OffsetConsumer {
public static void main(String[] args) {
Environment environment = Environment.builder().host("localhost").build();
String streamName = "test_stream";
long offset = 10; // 指定偏移量
// 创建消费者
Consumer consumer = environment.consumerBuilder()
.stream(streamName)
.offset(OffsetSpecification.offset(offset)) // 从指定偏移量开始
.messageHandler((context, message) -> {
============
.offset(OffsetSpecification.first()) // 从第一个消息开始
.autoTrackingStrategy() /
-----这里指定了 .autoTrackingStrategy() /就不用指定.offset(OffsetSpecification.first())了吧?
确实,如果你使用 `.autoTrackingStrategy()`,那么你不需要再指定 `.offset(OffsetSpecification.first())`,因为自动跟踪策略会自动从最新的消息开始消费并持续监听新的消息。让我们分别看看两种方式的完整代码示例。
### 自动跟踪策略(Auto Tracking Strategy)
这种方式下,消费者会自动从最新的消息开始消费,并持续监听新的消息。
#### 示例代码
```java
import com.rabbitmq.stream.Consumer;
import com.rabbitmq.stream.Environment;
import com.rabbitmq.stream.Message;
import com.rabbitmq.stream.ConsumerBuilder;
public class AutoTrackingConsumer {
public static void main(String[] args) {
Environment environment = Environment.builder().host("localhost").build();
String streamName = "test_stream";
// 创建消费者
Consumer consumer = environment.consumerBuilder()
.stream(streamName)
.autoTrackingStrategy() // 启用自动跟踪策略
.messageHandler((context, message) -> {
String body = new String(message.getBodyAsBinary());
System.out.println("Received message: " + body);
})
.build();
// 消费者会一直运行,监听新的消息
System.out.println("Consumer is listening for new messages...");
}
}
```
### 指定偏移量(Offset)的消费方式
这种方式下,消费者会从指定的偏移量开始消费消息,并在消费完这些消息后停止。
#### 示例代码
```java
import com.rabbitmq.stream.Consumer;
import com.rabbitmq.stream.Environment;
import com.rabbitmq.stream.Message;
import com.rabbitmq.stream.OffsetSpecification;
import com.rabbitmq.stream.ConsumerBuilder;
public class OffsetConsumer {
public static void main(String[] args) {
Environment environment = Environment.builder().host("localhost").build();
String streamName = "test_stream";
long offset = 10; // 指定偏移量
// 创建消费者
Consumer consumer = environment.consumerBuilder()
.stream(streamName)
.offset(OffsetSpecification.offset(offset)) // 从指定偏移量开始
.messageHandler((context, message) -> {
String body = new String(message.getBodyAsBinary());
System.out.println("Received message: " + body);
============
那里之前为什么要写: .offset(OffsetSpecification.first()) // 从第一个消息开始
.autoTrackingStrategy() /
?
你说得对,如果你使用 `.autoTrackingStrategy()`,就不需要再指定 `.offset(OffsetSpecification.first())`。这是一个错误的示例。使用 `.autoTrackingStrategy()` 时,消费者会自动从最新的消息开始消费,并持续监听新的消息。
让我们修正并简化这两种方式的示例代码:
### 自动跟踪策略(Auto Tracking Strategy)
这种方式下,消费者会自动从最新的消息开始消费,并持续监听新的消息。
#### 示例代码
```java
import com.rabbitmq.stream.Consumer;
import com.rabbitmq.stream.Environment;
import com.rabbitmq.stream.Message;
import com.rabbitmq.stream.ConsumerBuilder;
public class AutoTrackingConsumer {
public static void main(String[] args) {
Environment environment = Environment.builder().host("localhost").build();
String streamName = "test_stream";
// 创建消费者
Consumer consumer = environment.consumerBuilder()
.stream(streamName)
.autoTrackingStrategy() // 启用自动跟踪策略
.messageHandler((context, message) -> {
String body = new String(message.getBodyAsBinary());
System.out.println("Received message: " + body);
})
.build();
// 消费者会一直运行,监听新的消息
System.out.println("Consumer is listening for new messages...");
}
}
```
### 指定偏移量(Offset)的消费方式
这种方式下,消费者会从指定的偏移量开始消费消息,并在消费完这些消息后停止。
#### 示例代码
```java
import com.rabbitmq.stream.Consumer;
import com.rabbitmq.stream.Environment;
import com.rabbitmq.stream.Message;
import com.rabbitmq.stream.OffsetSpecification;
import com.rabbitmq.stream.ConsumerBuilder;
public class OffsetConsumer {
public static void main(String[] args) {
Environment environment = Environment.builder().host("localhost").build();
String streamName = "test_stream";
long offset = 10; // 指定偏移量
// 创建消费者
Consumer consumer = environment.consumerBuilder()
.stream(streamName)
.offset(OffsetSpecification.offset(offset)) // 从指定偏移量开始
.messageHandler((context, message) -> {
String body = new String(message.getBodyAs
相关文章:
尚硅谷rabbitmq 2024 流式队列2024指定偏移量 第55节答疑
rabbitmq的stream: 4、对比 autoTrackingstrategy方式:始终监听Stream中的新消息(狗狗看家,忠于职守)指定偏移量方式:针对指定偏移量的消息消费之后就停止(狗狗叼飞盘,回来就完) 这两种分别怎么写?java 在 RabbitMQ 中,…...
NSSCTF-WEB-pklovecloud
目录 前言 正文 思路 尝试 结尾 前言 许久未见,甚是想念. 今天来解一道有意思的序列化题 正文 思路 <?php include flag.php; class pkshow {function echo_name(){return "Pk very safe^.^";} }class acp {protected $cinder;public $neutron;public $…...
深入Postman- 自动化篇
前言 在前两篇博文《Postman使用 - 基础篇》《玩转Postman:进阶篇》中,我们介绍了 Postman 作为一款专业接口测试工具在接口测试中的主要用法以及它强大的变量、脚本功能,给测试工作人员完成接口的手工测试带来了极大的便利。其实在自动化测试上,Postman 也能进行良好的支…...
react-JSX
JSX理念 jsx在编译的时候会被babel编译为react.createELement方法 在使用jsx的文件中,需要引入react。import React from "react" jsx会被编译为React.createElement,所有jsx的运行结果都是react element React Component 在react中,常使用…...
深度对比:IPguard与Ping32在企业网络管理中的应用
随着网络安全形势日益严峻,企业在选择网络管理工具时需慎之又慎。IPguard与Ping32是目前市场上两款颇具代表性的产品,它们在功能、性能以及应用场景上各有优势。本文将对这两款产品进行深度对比,以帮助企业找到最合适的解决方案。 IPguard以其…...
AI测试之 TestGPT
如今最火热的技术莫非OpenAI的ChatGPT莫属,AI技术也在很多方面得到广泛应用。今天我们要介绍的TestGPT就是一个软件测试领域中当红的应用。 TestGPT是什么? TestGPT是一家总部位于以色列特拉维夫的初创公司 CodiumAI Ltd.,发布的一款用于测…...
JavaEE-进程与线程
1.进程 1.1什么是进程 每个应⽤程序运⾏于现代操作系统之上时,操作系统会提供⼀种抽象,好像系统上只有这个程序在运 ⾏,所有的硬件资源都被这个程序在使⽤。这种假象是通过抽象了⼀个进程的概念来完成的,进程可 以说是计算机科学…...
JAVA软开-面试经典问题(6)-equals与hashcode方法
1.equals方法 1.Object类中的equals方法比较的是两个对象的地址(底层原理是 比较的,即比较的是对象的地址) return (this obj);2.基本数据类型的包装类和String类都重写了equals方法。 基本数据类型:比较的是数值的是否相等 …...
计算机网络(以Linux讲解)
计算机网络 网络协议初识协议分层OSI七层模型TCP/IP五层模型--初识 网络中的地址管理IP地址MAC地址 网络传输基本流程网络编程套接字预备知识网络字节序socket编程UDP socketTCP socket地址转换函数Jsoncpp 进程间关系与守护进程进程组会话控制终端作业控制守护进程 网络命令TC…...
计算机网络基本架构知识点
1. 网络体系结构模型: - OSI 七层模型: - 物理层:是网络通信的基础层,负责在物理介质上传输比特流。该层定义了物理连接的标准,如电缆的类型、接口的形状、插头的规格等,以及信号的传输方式,包括…...
GES DISC 的 ATMOS L2 潜在温度网格上的痕量气体,固定场格式 V3 (ATMOSL2TF)
ATMOS L2 Trace Gases on Potential Temperature Grid, Fixed Field Format V3 (ATMOSL2TF) at GES DISC 简介 GES DISC 的 ATMOS L2 潜在温度网格上的痕量气体,固定场格式 V3 (ATMOSL2TF) 这是版本3的气溶胶痕量分子光谱(ATMOS)第二级产品…...
MLCC贴片电容不同材质区别:【及电容工作原理】
贴片电容的材质常规有:NPO(COG),X7R,X5R,Y5V 等,主要区别是它们的填充介质不同。在相同的体积下由于填充介质不同所组成的电容器的容量就不同,随之带来的电容器的介质损耗、容量稳定…...
Word粘贴时出现“文件未找到:MathPage.WLL”的解决方案
解决方案 一、首先确定自己电脑的位数(这里默认大家的电脑都是64位)二、右击MathType桌面图标,点击“打开文件所在位置”,然后分别找到MathPage.WLL三、把这个文件复制到该目录下:C:\Program Files\Microsoft Office\r…...
前端开发笔记--html 黑马程序员1
文章目录 前端开发工具--VsCode前端开发基础语法VsCode优秀插件Chinese --中文插件Auto Rename Tag --自动重命名插件open in browserOpen in Default BrowserOpen in Other Browser Live Server -- 实时预览 前端开发工具–VsCode 轻量级与快速启动 快速加载:VSCo…...
ARM/Linux嵌入式面经(四四):华星光电
文章目录 1、自我介绍2、介绍一下你最得意的一个项目3、这个项目里面都用到了什么模块,什么型号,有什么作用4、移植操作系统的过程中,流程是什么,需要注意什么移植操作系统的流程需要注意的事项面试官可能的追问及回答5、你用的传感器挺多的,怎么保证传感器传输的稳定性,…...
帮助,有奖提问
<?php $u $_GET[“user”]; //变量获取 $v $_GET[“variable”]; //$v看flag,绕过正则 $flag‘flag{}; if(isset($u)&&(file_get_contents($u,‘r’)“im admin”)){//猜测data://协议 //检查u指向 echo “hello admin!<br>”; if(preg_…...
Java编辑工具IDEA
哪个编程工具让你的工作效率翻倍? 在日益繁忙的工作环境中,选择合适的编程工具已成为提升开发者工作效率的关键。不同的工具能够帮助我们简化代码编写、自动化任务、提升调试速度,甚至让团队协作更加顺畅。那么,哪款编程工具让你…...
闲谈Promise
预备知识 回调函数:当一个函数作为参数传入另一个函数中,并且它不会立刻执行,当满足一定条件之后,才会执行,这种函数称为回调函数。比如:定时器。异步任务:与之对应的概念是同步任务࿰…...
【C++堆(优先队列)】1882. 使用服务器处理任务|1979
本文涉及知识点 C堆(优先队列) LeetCode1882. 使用服务器处理任务 给你两个 下标从 0 开始 的整数数组 servers 和 tasks ,长度分别为 n 和 m 。servers[i] 是第 i 台服务器的 权重 ,而 tasks[j] 是处理…...
VBA高级应用30例应用3Excel中的ListObject对象:选择表的一部分
《VBA高级应用30例》(版权10178985),是我推出的第十套教程,教程是专门针对高级学员在学习VBA过程中提高路途上的案例展开,这套教程案例与理论结合,紧贴“实战”,并做“战术总结”,以…...
usearch的内存泄漏自动化测试:在CI中集成泄漏检测
usearch的内存泄漏自动化测试:在CI中集成泄漏检测 【免费下载链接】usearch Fastest Open-Source Search & Clustering engine for Vectors & 🔜 Strings in C, C, Python, JavaScript, Rust, Java, Objective-C, Swift, C#, GoLang, and Wolf…...
万物识别在智能体(Skills Agent)中的集成应用
万物识别在智能体(Skills Agent)中的集成应用 想象一下,你正在开发一个智能客服机器人,用户发来一张照片,里面是自家厨房水槽下漏水的一堆零件。用户问:“这是什么东西坏了?我该买什么配件?” 传统的文本对…...
解锁微信多设备协同新体验:WeChatPad技术全解析
解锁微信多设备协同新体验:WeChatPad技术全解析 【免费下载链接】WeChatPad 强制使用微信平板模式 项目地址: https://gitcode.com/gh_mirrors/we/WeChatPad WeChatPad通过创新的设备伪装技术,突破微信单设备登录限制,实现手机与平板的…...
白鲸开源架构师获邀成为 ASF Member
在技术领域,我们常常被那些闪耀的、可见的成果所吸引。今天,这个焦点无疑是大语言模型技术。它们的流畅对话、惊人的创造力,让我们得以一窥未来的轮廓。然而,作为在企业一线构建、部署和维护复杂系统的实践者,我们深知…...
编程技巧:模式切换程序框架
目录 1.模式切换程序框架 2.实现思路 3.模式切换程序框架 4.模式切换每个模式模块化流程 5.代码 Mode1.c Mode2.c Mode3.c Global.c main.c 1.模式切换程序框架 Init:进入模式前,执行一遍,用于初始化工作 Loop:执行完In…...
佰力博金属电导率测试:精准赋能金属材料性能评估
金属电导率是衡量材料导电能力的核心指标,直接决定铜、铝、合金等在电子、电力、航空航天等领域的应用价值。佰力博检测依托专业技术与自研设备,构建了覆盖多场景、高精度的金属电导率测试体系,为材料研发、质量管控与工艺优化提供权威数据支…...
Vision Master OpenCV 2.0 深度评测:新增YOLOv5、语义分割等ONNX模型,实战性能提升有多大?
Vision Master OpenCV 2.0 深度评测:ONNX模型实战性能全解析 当计算机视觉开发工具开始拥抱ONNX生态,技术选型的边界正在被重新定义。Vision Master OpenCV 2.0的发布恰逢其时,它不仅将YOLOv5、语义分割等前沿模型集成到可视化流程中…...
UE5 - 动态材质与电子围栏:ArchvizExplorer与Map Border Collection的深度整合
1. 动态材质与电子围栏的完美结合 在UE5的建筑可视化项目中,电子围栏效果常常需要与场景动态交互。ArchvizExplorer作为建筑可视化利器,配合Map Border Collection的边界功能,能创造出令人惊艳的动态围栏效果。我最近在一个商业综合体项目中实…...
传统信号处理与AI结合:FUTURE POLICE模型前端预处理技术详解
传统信号处理与AI结合:FUTURE POLICE模型前端预处理技术详解 最近在做一个语音相关的AI项目,发现直接把麦克风录到的原始音频丢给模型,效果总是不太理想。背景的键盘声、远处的谈话声,甚至是空调的嗡嗡声,都会让模型的…...
Kangaroo运动控制器Packet Serial通信协议详解
1. Kangaroo运动控制器底层通信技术解析 Kangaroo运动控制器是由RoboClaw系列厂商推出的专用闭环步进/伺服电机驱动模块,其核心价值在于将复杂的PID调节、电流环控制、位置反馈处理等算法固化于硬件中,使上位机仅需通过精简的串行协议即可完成高精度运动…...
