尚硅谷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

相关推荐
计算机毕设指导63 分钟前
基于 SpringBoot 的作业管理系统【附源码】
java·vue.js·spring boot·后端·mysql·spring·intellij-idea
Gu Gu Study4 分钟前
枚举与lambda表达式,枚举实现单例模式为什么是安全的,lambda表达式与函数式接口的小九九~
java·开发语言
Chris _data7 分钟前
二叉树oj题解析
java·数据结构
牙牙70512 分钟前
Centos7安装Jenkins脚本一键部署
java·servlet·jenkins
时光の尘19 分钟前
C语言菜鸟入门·关键字·float以及double的用法
运维·服务器·c语言·开发语言·stm32·单片机·c
paopaokaka_luck20 分钟前
[371]基于springboot的高校实习管理系统
java·spring boot·后端
以后不吃煲仔饭33 分钟前
Java基础夯实——2.7 线程上下文切换
java·开发语言
进阶的架构师33 分钟前
2024年Java面试题及答案整理(1000+面试题附答案解析)
java·开发语言
前端拾光者37 分钟前
利用D3.js实现数据可视化的简单示例
开发语言·javascript·信息可视化
The_Ticker39 分钟前
CFD平台如何接入实时行情源
java·大数据·数据库·人工智能·算法·区块链·软件工程