You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NATS Consumer仅读取500条消息:如何获取所有Subject最后一条消息

解决NATS Consumer读取LastPerSubject时的消息数量限制问题

你当前的实现仅执行了一次fetch操作,而NATS JetStream的fetch默认批量上限是500条,因此无法获取超过500条的消息。要实现无限制读取所有Subject的最后一条消息,需要循环执行fetch操作,直到没有新消息返回为止。

修改后的代码

val options = Options.builder()
    .server("nats://url:port")
    .authHandler(Nats.credentials("/Users/check/key.txt"))
    .build()
val connection = Nats.connect(options)
val js = connection.jetStream()
val consumerConfig = ConsumerConfiguration
    .builder()
    .filterSubject("subject.>")
    .deliverPolicy(DeliverPolicy.LastPerSubject)
    .build()

// 获取流上下文并创建/更新消费者
val streamContext: StreamContext = js.getStreamContext("STREAM_NAME")
val consumerContext = streamContext.createOrUpdateConsumer(consumerConfig)

val fetchConsumeOptions = FetchConsumeOptions.builder().noWait().build()
var totalCount = 0

try {
    while (true) {
        var batchCount = 0
        consumerContext.fetch(fetchConsumeOptions).use { fetchConsumer ->
            while (true) {
                val msg = fetchConsumer.nextMessage() ?: break
                batchCount++
                println("Message Received:")
                println(msg.subject)
                println(String(msg.data, StandardCharsets.UTF_8))
                msg.ack()
            }
        }
        // 如果当前批次没有获取到消息,说明所有消息已读取完成
        if (batchCount == 0) {
            break
        }
        totalCount += batchCount
    }
    println("Total messages received: $totalCount")
} catch (e: Exception) {
    e.printStackTrace()
} finally {
    // 关闭连接释放资源
    connection.close()
}

关键修改说明

  • 循环执行fetch:在外层添加循环,每次fetch处理完当前批次的消息后,再次调用fetch获取下一批,直到某次fetch没有返回任何消息(batchCount == 0)。
  • 保留LastPerSubject策略:该配置确保消费者只会获取每个匹配Subject的最后一条消息,不会重复读取同一Subject的历史消息。
  • 添加连接关闭逻辑:在finally块中关闭NATS连接,避免资源泄漏。

内容的提问来源于stack exchange,提问作者kruthiknivas thangamani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 17:25:03