2016-03-19 20 views
3

Javaクロニクル1.9.2を使用してメッセージの書き込み/読み取りを試みています。私は新しいバージョンが利用可能であることを知っているが、私はそれに多くの時間を投資する前にいくつかの質問があります。Javaクロニクルメッセージは読み込み後に削除されません

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

オプションはありますか?私は次のコードをしようとしていると私はリーダーを開始するたびに、私は再びすべてのメッセージを取得します。 また、特定の期間の後に自動的に削除されるように、有効期間を設定するメッセージを入れるオプションがあります。

WRITER -

 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(); 

READER -

 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(); 

答えて

3

私は私がクロニクルからの抜粋を読んでたら、メッセージを削除する必要があります。

これを削除する唯一の方法はファイルローリングです。あなたはIndexedChronicleでこれを行うことができます。またはVanillaChronicleまたは現在のSingleChronicleQueueを使用することができます。

私の読者が再び始まると、最初に戻らなくなります。私はそれを削除したいので、私はそれを読むと、メッセージは役に立たないです。

標準の方法は、ソースIDを含む結果をクロニクルに書き込むことです。この方法で、どのメッセージが正常に処理されたかを常に知ることができます。例えばメッセージを読み取ることはできますが、クラッシュが発生した場合は処理されません。

私は次のコードを試しています。私がリーダーを開始するたびに、私はすべてのメッセージを再度取得します。

これはデフォルトで行われるように設計されています。どのメッセージが正しく処理されたかを把握する方法はあなた次第です。 (別のキューにこれを記録し、そのインデックスを見つけるために最後のメッセージを読むことをお勧めしますが)

Time to Liveメッセージを入れるという選択肢がありますので、一定時間後に自動的に削除されます。

各メッセージにタイムスタンプを追加して古いメッセージを無視できます。

クロニクルキューv4.1.0は最新リリースです。

+0

私は編集を考えていた間、あなたの迅速な対応に感謝します!私は5分ごとにファイルをリセットすることを考えています。メッセージが読まれるかどうかは、分析したい最後の数分の状況からです。クロニクル(上記のコード)のポインタをリセットするか、削除して再作成するオプションがありますそれなど
もし私がインデックスをリセットすることができるなら、すべての読者はexcerpt.netIndex()で最新のポジションを取るでしょうか? – chappalprasad

+0

@chappalprasadそれをリセットして新しいファイルを開始する唯一の方法です。テスト目的でclear()を使用できます。キューは、ロギングを最小限に抑えるためにメッセージを長期間保存する必要があり、バグやパフォーマンスの問題を解決するためにプロダクションからのメッセージへの応答をサポートする必要がある場合に、一般的に使用されます。 –

+0

上記のREADERコードの最後の5分間は、どのようにしてレコードにアクセスできますか?私はインデックス(長いvIndex)メソッドを参照してくださいいくつかの固定レコードサイズなどに基づいて渡す​​vIndexを計算しますか? – chappalprasad

関連する問題