Java ApachePulsar阅读器仍然可以获取应该删除的消息

Java ApachePulsar阅读器仍然可以获取应该删除的消息,java,mq,apache-pulsar,Java,Mq,Apache Pulsar,我是Apache Pulsar的新手,也是MQ系统的新手。现在,我有一个关于脉冲星阅读器的问题 问题描述: 我启动一个脉冲星实例,然后启动一个消费者,听一个主题a。 然后我启动一个制作人,向主题a发送100条消息,消费者消费了这100条消息,消费者订阅的Backlog值为0。主题上只有一个订阅,并且是独占的 然后,我启动一个阅读器,将阅读器的主题设置为a,阅读器可以从主题a获得消息 我在Pulsar文档上找到了这个: Pulsar代理负责处理通过Pulsar的消息,包括消息的持久存储。默认情况

我是Apache Pulsar的新手,也是MQ系统的新手。现在,我有一个关于脉冲星阅读器的问题

问题描述: 我启动一个脉冲星实例,然后启动一个消费者,听一个主题a。 然后我启动一个制作人,向主题a发送100条消息,消费者消费了这100条消息,消费者订阅的Backlog值为0。主题上只有一个订阅,并且是独占的

然后,我启动一个阅读器,将阅读器的主题设置为a,阅读器可以从主题a获得消息

我在Pulsar文档上找到了这个:

Pulsar代理负责处理通过Pulsar的消息,包括消息的持久存储。默认情况下,经纪人:

立即删除每个订阅中已确认的所有邮件, 并将所有未确认的消息持久存储在待办事项列表中

这100条消息应该已经被删除了。 那么为什么脉冲星阅读器仍然可以从主题A中获得信息呢

我的代码:

消费者:

private static void consume() {
        try {
            PulsarClient pulsarClient = PulsarClient.builder().serviceUrl("pulsar://127.0.0.1:6650").build();
            Consumer<String> consumer = pulsarClient.newConsumer(Schema.STRING)
                    .topic("A")
                    .subscriptionName("first-subscription")
                    .subscribe();

            for (int i = 0; true; ++i) {
                try {
                    Message<String> msg = consumer.receive();
                    String m = msg.getValue();
                    System.out.println("\t m:" + m);
                    consumer.acknowledge(msg);
                    Thread.sleep(500);
                } catch (Exception e) {
                    LOGGER.error("", e);
                }
            }
        } catch (Exception e) {
            LOGGER.error("", e);
        }
    }
制作人:

private static void produce() {
        try {
            PulsarClient pulsarClient = PulsarClient.builder().serviceUrl("pulsar://127.0.0.1:6650").build();
            Producer<String> producer = pulsarClient.newProducer(Schema.STRING).topic("A").create();
            for (int i = 0; i < 100; ++i) {
                producer.send("producer-simple-partitioned-" + i);
            }
        } catch (Exception e) {
            LOGGER.error("", e);
        }
    }
读者:

private static void readerRead() {
        try {
            PulsarClient pulsarClient = PulsarClient.builder().serviceUrl("pulsar://127.0.0.1:6650").build();
            Reader<byte[]> reader = pulsarClient.newReader()
                    .topic("A")
                    .startMessageId(MessageId.earliest)
                    .create();
            while (true) {
                Message message = reader.readNext();
                System.out.println(new String(message.getData()));
            }
        } catch (PulsarClientException e) {
            LOGGER.error("", e);
        }
    }

您在读卡器界面中体验到的行为似乎是一种可能的情况。在这种情况下,文档是不正确的,因为消息在确认后不会被明确删除。如果包含消息的分类账仍然存在,则可以读取消息

实际上,这部分文件将在以下文件中:

请注意,不再存储的消息不一定 立即删除,并且在 下一个分类账滚动。因为客户无法预测何时滚动 可能发生的情况下,依靠在某个时间没有发生的翻滚是不明智的 不方便的时间点

默认情况下,当脉冲星消息到达代理时,它将 存储,直到在所有订阅上确认为止,其中 该点将被标记为删除