Nach dem Download mehrerer Dateien mit Camel über FTP sollte ich sie verarbeiten, aber sie sind in tar.gzip Formate. Camel unterstützt gzip und wie ich sehe auch tar-Endpunkt ab 2.16.0 (http://camel.apache.org/camel-2160-release.html).camel entpacken tar.gzip files
Der Code, den ich für die Extraktion des gzip haben:
from("file:modelFiles?readLock=changed&recursive=true&consumer.delay=1000")
.unmarshal(new ZipFileDataFormat())
.choice()
.when(body().isNotNull())
.log("Uziping file ${file:name}.")
.to("file:modelFiles_unzipped")
.endChoice()
.end();
Alle Dateien durch die Regel laufen, aber sie werden als tar.gz wieder erstellt, aber desto schlechter ist, dass der Inhalt wird auch korrupt, Sie können danach nicht einmal als gzip-Archive geöffnet werden.
Fragen:
- Wie soll ich die gzip Archive entpacken?
- Wie könnte ich das gleiche für die TAR-Dateien tun?
Update 1:
Danke für den Beitrag Jeremie. Ich änderte den Code wie folgt wie vorgeschlagen:
from("file:modelFilesSBML2?readLock=changed&recursive=true&consumer.delay=1000")
.unmarshal().gzip()
.split(new TarSplitter())
.to("file:modelFilesSBML_unzipped");
Dann habe ich die folgende Ausnahme erhalten (nur zur Info die tar.gzip Dateien sind nicht von Null Länge): FailedException: Kann nicht null Körper schreiben in Datei: modelFilesSBML_unzipped \ 2006-01-31 \ BioModels_Database-r4-sbml_files.tar.gz:
2016-03-22 14:11:47,950 [ERROR|org.apache.camel.processor.DefaultErrorHandler|MarkerIgnoringBase] Failed delivery for (MessageId: ID-JOY-49807-1458652278822-0-592 on ExchangeId: ID-JOY-49807-1458652278822-0-591). Exhausted after delivery attempt: 1 caught: org.apache.camel.component.file.GenericFileOperationFailedException: Cannot write null body to file: modelFilesSBML_unzipped\2006-01-31\BioModels_Database-r4-sbml_files.tar.gz
Lösung:
viele Möglichkeiten Nach dem Versuch, ich bin es schließlich wie folgt verwendet wird (Mit Camel 2.17.0 es hat nicht funktioniert mit 2.16.0 oder 2.16.1):
from("file:modelFilesSBML?noop=true&recursive=true&consumer.delay=1000")
.unmarshal().gzip()
.split(new TarSplitter())
.to("log:tar.gzip?level=INFO&showHeaders=true")
.choice()
.when(body().isNotNull())
.log("### Extracting file: ${file:name}.")
.to("file:modelFilesSBML_unzipped?fileName=${in.header.CamelFileRelativePath}_${file:name}")
.endChoice()
.end();
Mit Camel 2.17.0 Sie auch den Körper überspringen kann() isNotNull() zu überprüfen..
Jeremies Vorschlag hilft sehr, also werde ich seine Antwort als Lösung akzeptieren. Trotzdem würde die Ausnahme immer noch kommen, wenn ich den Nachrichtentext nicht auf Null prüfen würde. Die fileName = $ {in.header.CamelFileRelativePath} _ $ {file: name} behält auch die ursprüngliche Dateistruktur, wo der Dateiname die Datei.tar.gz vorangestellt ist, aber ich habe keine andere Möglichkeit gefunden, die Verzeichnisstruktur, da der Dateiendpunkt keine Ausdrücke für das Verzeichnis in ("file: directory? options ...") akzeptiert.
Danke Jeremie, ich habe es versucht, aber dann beklagt sich eine Ausnahme über den Nullkörper. Dies ist ähnlich der ursprünglichen Ausnahme, für die ich im ursprünglichen Code eine Nullkörperprüfung hinzugefügt habe, aber dann wird alles weggelassen. – Tamas
Ich weiß es nicht. Ich habe den Code in meiner Antwort mit mehreren tar.gz auf meinem Rechner getestet, es funktionierte ohne Null-Check. –
Jeremie, was denkst du über die Lösung? Ich meine den Teil, der die ursprünglichen Verzeichnisstrukturen behält. Nochmals vielen Dank für Ihren Kommentar. – Tamas