3

我正在尝试使用 Java Chronicle 1.9.2 来编写/读取消息。我知道有更新的版本可用,但在我投入更多时间之前有几个问题。

阅读编年史节选后,我需要删除该消息。因此,如果我的读者重新开始,它不会回到开头。此外,一旦我阅读了消息,我就没有用了,所以想将其删除。

有选择吗?我正在尝试以下代码,每次启动阅读器时,我都会再次收到所有消息。还有一个选项可以在消息上放置“生存时间”,以便在特定时间段后自动将其删除。

作家——

        String tempPath = System.getProperty("java.io.tmpdir");
        String basePrefix = tempPath  + "chronicle";
        System.out.println("base prefix: " + basePrefix);
        Chronicle chr = new IndexedChronicle(basePrefix);
        final Excerpt excerpt = chr.createExcerpt();
        excerpt.startExcerpt(this.getmsgtext().length() + 4);
        excerpt.writeBytes(this.getmsgtext());
        excerpt.finish();
        chr.close();

读者——

        String tempPath = System.getProperty("java.io.tmpdir");
        String basePrefix = tempPath +  "chronicle";
        System.out.println("base prefix: " + basePrefix);
        Chronicle chr = new IndexedChronicle(basePrefix);
        final Excerpt excerpt = chr.createExcerpt();

        while (excerpt.nextIndex()) {
                System.out.println("Read string from chronicle: " + excerpt.readByteString());
        }
        chr.close();
4

1 回答 1

3

阅读编年史节选后,我需要删除该消息。

删除它们的唯一方法是文件滚动。您可以自己使用 IndexedChronicle 或使用 VanillaChronicle 或当前 SingleChronicleQueue

因此,如果我的读者重新开始,它不会回到开头。此外,一旦我阅读了消息,我就没有用了,所以想将其删除。

标准做法是将您的结果(包括源 ID)写入 Chronicle。这样,您始终知道哪些消息已成功处理。例如,如果发生崩溃,您可能会读取消息但未处理。

我正在尝试以下代码,每次我开始阅读器时,我都会再次收到所有消息。

这就是它的默认设计。如何跟踪正确处理了哪些消息取决于您。(尽管我们建议将其记录在另一个队列中并阅读最后一条消息以找到该索引)

是否可以选择在消息上放置“生存时间”,以便在特定时间段后自动将其删除。

您可以为每条消息添加时间戳并忽略旧消息。

Chronicle Queue v4.1.0 是最新版本。

于 2016-03-19T14:43:37.343 回答