Obwohl es ziemlich spät ist, aber nur daran gedacht, den Ansatz zu schreiben, den ich verwendet habe, um diese Funktionalität zu erreichen.
Nehmen wir an, wir beginnen einen Job, um eine Datei regelmäßig zu lesen, alle 5 Minuten.
- Während ersten Lauf, lesen Sie die gesamte Datei
- Shop Zeilenzahl und der Zeitpunkt der letzten Änderung der Datei
Es ist interessant wird für nachfolgende Auftrag ausgeführt wird.
- Überprüfen Sie beim nächsten Joblauf, ob die Datei geändert wurde (mit der Datei der letzten Änderung und der Datei, die während der vorherigen Jobausführung gespeichert wurde). Wenn die Datei nicht geändert wird, nichts tun.
- Wenn die Datei geändert wird, müssen wir nur die neuen Zeilen lesen. Wir haben die Zeilenanzahl aus dem früheren Job, also verwenden Sie sie, um die Anzahl der zu überspringenden Zeilen zu bestimmen.
So weit so gut, was ist, wenn die Datei gerollt wird?
- Angenommen wir das Muster für die Dateibenennung haben, wenn die Datei über gerollt ...
- alle Dateien Holen Sie sich das Pattern-Matching und sie in aufsteigender Reihenfolge sortieren basierend auf Datei zuletzt geändert Zeit
- Iterate durch die Dateien und beginnen Sie mit demjenigen, dessen letzte geänderte Zeit größer ist als die Zeit, die vom vorherigen Joblauf gespeichert wurde.Verwenden Sie Linie intelligent gespeichert zählen die bereits gelesenen Zeilen
- Reset-Leitung Zahl zu überspringen, wenn Sie mit einer neuen Datei danach
starten Das ist es!
Möglicherweise müssen Sie für einige ungewöhnliche Szenarien IF-Bedingungen an einigen Stellen setzen. Ein solches Szenario ist, wenn Sie durch die Dateien iterieren und wenn die Zeit der letzten Änderung der Datei genau der gespeicherten Datei entspricht, setzen Sie einfach die Zeilenanzahl zurück - so dass sie mit der ersten Zeile der nächsten/neuen Datei beginnt.
Beispielcode für die nachfolgenden Auftrag ausgeführt:
für (Datei: Dateien) {
if (file.lastModified()> storedLastModifiedTime) {
// Sie haben die Datei zu verarbeiten, kümmern die Zeilenzahl
} else if (file.lastModified() == storedLastModifiedTime) {
// Reset gespeichert Zeilenzahl
}
}
Irgendwelche Vorschläge/Kommentare/Fragen?
"Protokolldatei inkrementell lesen und verarbeiten." - Bitte fügen Sie weitere Details hinzu. – darioo
Nehmen wir an, es gibt eine Anwendung, die Protokolle erzeugt (in Dateien), dann möchte ich einen Code (in Java) schreiben, der diese neuesten Protokolle lesen würde, wenn sie generiert werden und sie entsprechend der Anforderung verarbeiten. Das erste Lesen von Logs ist kein Problem, aber wie verfolgen wir den letzten Datensatz/Zeilenlesevorgang? Was passiert auch, wenn die Datei aufgrund der Größe oder eines anderen konfigurierten Parameters gerollt wird? –
Als ich dieses Problem hatte, fand ich die Antwort hier: http://www.informit.com/guides/content.aspx?g=java&seqNum=226 – Dan