Pulsar Reader会错过阅读器离线时所写的消息

时间:2020-01-08 15:48:37

标签: apache-pulsar

我有一个Pulsar阅读器,可以读取消息并进行处理。当消息到达某个主题时,读者就会收到它。但是,假设该读取器应用程序离线一段时间并重新连接到脉冲星群,则该读取器不会读取在该读取器离线期间写入Pulsar的消息。但是,重新启动阅读器时,它不会阅读已经消耗的旧消息。读者已设置为startMessageId(MessageId.latest)

这是读者的预期行为吗?还是我缺少什么?下面是我的简单代码,可供参考。

PulsarClient pulsarClient = PulsarClient.builder().serviceUrl(pulsarServiceUrl).build();
Reader<String> reader = pulsarClient.newReader(Schema.STRING).readerName("reader-1").startMessageId(MessageId.latest)
                .topic("persistent://public/default/topic-1").create();
while(true) {
  Message<String> data = reader.readNext(); //blocks if there are no new messages
  System.out.println(data.getValue());
}

1 个答案:

答案 0 :(得分:2)

使用阅读器界面,您必须跟踪从该主题中读取的消息ID。由于您使用的是MessageId.latest,因此每次客户端连接时(例如,重新启动后),客户端都会将其自身定位为主题的结尾。如果您想从上次中断的地方接听,则需要跟踪应用程序收到的最后一条消息ID,并将其用作startMessageId

如果您不想跟踪消息ID,可以使用 Consumer 界面让Pulsar为您完成此操作。使用消费者,您可以指定订阅名称,以跟踪您在主题中的位置。因此,如果客户端在使用 Consumer 界面时重新启动,则将从上次中断的地方接起电话。有关更多信息,请参见此page

相关问题