2016-03-20 12 views
0

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:

  1. Wie soll ich die gzip Archive entpacken?
  2. 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.

Antwort

3

Sie können die Komponente camel-tarfile verwenden.

Wenn Ihr tar.gz mehrere Dateien enthält, sollten Sie entpacken, entpacken und den Austausch für jede Datei aufteilen. Der TarSplitter ist ein Ausdruck, der für jede im tar enthaltene Datei ein tar in einen Iterator aufteilt.

from("file:target/from") 
    .unmarshal().gzip() 
    .split(new TarSplitter()) 
    .to("file:target/to"); 
+0

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

+0

Ich weiß es nicht. Ich habe den Code in meiner Antwort mit mehreren tar.gz auf meinem Rechner getestet, es funktionierte ohne Null-Check. –

+0

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