3

メッセージの書き込み/読み取りに Java Chronicle 1.9.2 を使用しようとしています。新しいバージョンが利用可能であることは知っていますが、より多くの時間を費やす前にいくつか質問があります。

クロニクルからの抜粋を読んだら、メッセージを削除する必要があります。そのため、リーダーが再び開始しても、最初には戻りません。また、メッセージは一度読んだら役に立たないので削除したいと思います。

それを行うオプションはありますか?次のコードを試していますが、リーダーを起動するたびに、すべてのメッセージが再び表示されます。また、特定の期間が経過すると自動的に削除されるように、メッセージに Time to Live を設定するオプションがあります。

ライター -

        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 に答える