2017-06-26 3 views
0

ich den folgenden Code haben von Chronicle Warteschlange lesen (in Kotlin geschrieben, aber das spielt keine Rolle):Wie lese ich die letzten N Einträge aus der Chronikliste?

val queue = ChronicleQueueBuilder.single(path).build() 
val tailer = queue.createTailer() 

tailer.toEnd() 

// // This code is wrong 
// val lastIndex = tailer.index() 
// 
// val shift = lastIndex - 10 
// if (shift > 0) { 
//  tailer.moveToIndex(lastIndex) 
// } 

while (true) { 
    val text = await(tailer) 

    if (prefix == null) { 
     println(text) 
    } else { 
     if (text.startsWith(prefix)) { 
      // Would be nice without additional allocation ... 
      println(text.substring(prefix.length + 1)) 
     } 
    } 
} 

Wie kann ich den kommentierten Code ändern lesen vorherigen 10 Datensätze aus der Warteschlange und weiter?

Begründung: Dies ist nützlich in Situationen, in denen die Warteschlange für die Anzeige von Protokollen verwendet wird. Sie möchten einige vorherige Protokollierungsanweisungen sehen und neue Protokollierungsanweisungen sehen, wie sie kommen.

+0

was ist das Problem mit dem kommentierten Code.? Normalerweise sollte es zurückgehen. – Krishas

+0

Ich werde es noch einmal testen. Es gab eine Ausnahme, denke ich. Ich bin mir nicht sicher, ob es funktionieren kann, da ich nicht weiß, was genau der Index ist. Ist es Zeiger auf Binärdaten? Ist es ein logischer Index meiner Aufzeichnungen? Ich werde mir Projekttests anschauen, um das besser zu verstehen. –

+0

Ich bin kein Committer, aber meiner Erfahrung nach erhöht sich der Index für jedes neue Dokument und Sie erhalten die neuesten 10 Dokumente, indem Sie den Index einfach um 10 subtrahieren und von dort lesen. Außerdem sollte der Index den Zeiger und die Anzahl der Zyklen enthalten. – Krishas

Antwort

1

Ich habe einen Test für Sie geschrieben. Bitte führen Sie das gleiche aus, es sollte funktionieren.

public class ChronicleTest { 

private String chroniclePath = "/tmp/chronicle-test"; 

private int msgCount = 10; 

private int i = 0; 

    @Test 
    public void writeToQ() { 
     ChronicleQueue queue = ChronicleQueueBuilder.single(chroniclePath).build(); 
     ExcerptAppender appender = queue.acquireAppender(); 
     for (i = 1; i <= msgCount; i++) { 
      appender.writeBytes(b -> { 
       b.writeInt(i); 
      }); 
     } 
     ExcerptTailer tailer = queue.createTailer(); 
     tailer.toEnd(); 
     long lastIndex = tailer.index(); 
     tailer.moveToIndex(lastIndex - 5); 

     while (tailer.readBytes(b -> { 
      int value = b.readInt(); 
      System.out.println("Received:" + value); 
     })) 
      System.out.println("Completed"); 
    } 
} 
+0

Mein Problem war mit einem Fehler in Version 4.5.5. Mein Code funktioniert mit 4.6.6. Vielen Dank! –

0

Zusätzlich direkt über den Index auf, könnten Sie die direction-Eigenschaft der ExcerptTailer verwenden:

final SingleChronicleQueue queue = createQueue(); 

    final int totalRecords = 20; 
    final int tailRecords = 10; 

    final ExcerptAppender appender = queue.acquireAppender(); 
    for (int i = 0; i < totalRecords; i++) { 
     try(final DocumentContext ctx = appender.writingDocument()) { 
      ctx.wire().writeText(Integer.toString(i)); 
     } 
    } 

    final ExcerptTailer tailer = queue.createTailer(); 
    tailer.direction(TailerDirection.BACKWARD).toEnd(); 

    int rewind = tailRecords; 
    final int endCycle = tailer.cycle(); 
    while(--rewind != 0) { 
     try(final DocumentContext ctx = tailer.readingDocument()) { 
      if (!ctx.isPresent()) { 
       break; 
      } 

      if (endCycle != tailer.cycle()) { 
       System.out.println("Rewound past beginning of cycle"); 
      } 
     } 
    } 

    tailer.direction(TailerDirection.FORWARD); 

    for (int i = 0; i < tailRecords; i++) { 
     try(final DocumentContext ctx = tailer.readingDocument()) { 
      if (!ctx.isPresent()) { 
       break; 
      } 

      System.out.println(ctx.wire().readText()); 
     } 
    } 
Verwandte Themen