2017-08-28 13 views
2

私はシステムにクロニクルキューを実装しようとしていますが、ファイルのローリングに関する問題がありましたが、プロセスのローカルタイムゾーンごとに特定の時刻に質問がありました。私は、ロールサイクルを指定する方法に関するいくつかの記事を読むが、ドキュメントごとにエポックタイムはUTCの真夜中に働く。ロールサイクルを設定するために何をする必要がありますか?毎日午後5時に、プロセスのローカルタイムゾーンを実行していますか?助言がありますか?クロニクルロールファイル毎日

public class TestRollCycle { 

    public class TestClass implements TestEvent { 
     private int counter = 1; 

     @Override 
     public void setOrGetEvent(String event) { 
      System.out.println("Counter Read Value: " + counter); 
      counter++; 
     } 
    } 

    public interface TestEvent { 
     void setOrGetEvent(String event); 
    } 

    @Test 
    public void testRollProducer() { 
     int insertCount = 1; 
     String pathOfFile = "rollPath"; 
     // Epoch is 5:15PM EDT 
     SingleChronicleQueue producerQueue = SingleChronicleQueueBuilder.binary(pathOfFile).epoch(32940000).build(); 
     ExcerptAppender myAppender = producerQueue.acquireAppender(); 
     TestEvent eventWriter = myAppender.methodWriter(TestEvent.class); 

     while (true) { 
      String testString = "Insert String"; 
      eventWriter.setOrGetEvent(testString); 

      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      System.out.println("Counter Write Value: " + insertCount); 
      insertCount++; 
     } 
    } 

    @Test 
    public void testRollConsumer() throws InterruptedException { 
     String pathOfFile = "rollPath"; 
     // Epoch is 5:15PM EDT 
     SingleChronicleQueue producerQueue = SingleChronicleQueueBuilder.binary(pathOfFile).epoch(32940000).build(); 
     TestClass myClass = new TestClass(); 
     ExcerptTailer trailer = producerQueue.createTailer(); 
     MethodReader methodReader = trailer.methodReader(myClass); 

     while (true) { 
      if (!methodReader.readOne()) { 
       Thread.sleep(1000); 
      } else { 
       //System.out.println(trailer.index()); 
      } 
     } 
    } 
} 

答えて

1

これはChronicle Queue Enterpriseに追加された機能です。あなたがそれを支払うつもりなら、[email protected]areに連絡することをお勧めします。

+0

ああ...ありがとう。確認して確認する必要があります。関連する別の質問では、UTCの深夜のデフォルトロール機能を使用していると言えますが、切り替えの瞬間の状態はどうなっていますか?私は、一定のストリームのメッセージがその時間中に永続化するのを待っている場合、メッセージが失われる可能性があること、またはすべてがシームレスであることを意味しますか? – ATO

+0

夏時間の変更を伴うタイムゾーンではなく、固定の時刻としてビルダーに 'epoch'を指定することができます。私たちはあなたが書面を失うかもしれない状況、またはメッセージを読んでいないことを知りません。 –

+0

ピーター - 私は以下のことをしました。ロールのベンチマークはUTC真夜中で、私は午後9時(UTC)を意味する5PM EDTでロールを発生させたいからです。だから、私は32400000ミリ秒(== 9時間)を指定しました。 3.30PM EDTで私のサンプルを始めました。私は5PM EDTで新しい日に起こるべき役割を期待していましたが、決して起こらなかったのです。これは期待されていますか?他に言及されたドキュメント。 – ATO

1

あなたのテストには問題があると思います。キュービルダーに供給される32940000のエポックは、真夜中から9時15分、午前9時15分(UTCまたは午前5時15分)です。ロールアップ時間が午後5時15分になると、12時間後にもう1時間かかるはずです。

私はあなたのユースケースの現在の動作を文書化し、期待どおりに合格するテストを追加しました。正しいエポックオフセットを供給していることを再度確認できます。ロールイベントをキャプチャ/ログするには、StoreFileListenerを実装してください。

ロールはロールバック境界の後のキューにイベントが書き込まれるまで実際には発生しません。したがって、書き込まれていないアイドルキューは、入力イベントがなければロールバックしません。

テストはgithubの上にある:応答のための

https://github.com/OpenHFT/Chronicle-Queue/blob/master/src/test/java/net/openhft/chronicle/queue/impl/single/QueueEpochTest.java

+0

Ahh ..私は問題を理解しました... 9対21 ...ありがとう..追加したテストコードに関しては、epochを置き換えるrollTimeメソッドが最新のリリースv4.5.27の一部ではないようです。これはベータ版か有料版ですか?クラスDirectoryUtils。 – ATO

+0

mavenに公開された最新のリリースはかなり古くなっています。アーティファクトはもはやMaven Centralに公開されなくなりました(https://github.com/OpenHFT/Chronicle-Queue#downloadを参照)。ソースからビルドし、自分のリポジトリにアーティファクトをホストすることをお勧めします。 –

+0

ありがとうございました。マスターは検索する正しいブランチですか?またはタグ - クロニクル - キュー - 4.6.15? – ATO