2016-06-23 11 views
0

Ich möchte eine Zip-Datei in einen Ordner entpacken, der wie die Zip-Datei heißt. Z.B. Original/abc.zip sollte entpackt werden, um zu importieren/abc/Entpacken Sie die Datei mit camel im Ordner namens zip-file

Was ich jetzt habe, entpackt die Dateien im angegebenen Ordner.

Wie kann ich den Dateinamen aus der "from" -Datei und in den "to" -Abschnitt bringen?

Ich bin neu mit Camel, so würde jede Hilfe approved werden. Vielen Dank!

Antwort

3

Diese Route extrahiert die Kontexte einer Zip-Datei von einem Ordner Posteingang zu einem outbox Ordner, in einem übergeordneten Ordner, in dem der Muttername extrahierte der Name der ZIP-Datei ist. Ich denke, es deckt alle Ihre Anforderungen ab.

fromF("file:%s?noop=true","inbox") 
    .split(new ZipSplitter()) 
    .streaming() 
    .toD("file:{{my.outbox}}/${file:onlyname.noext}/"); 

Einige Anmerkungen:

  1. String Verkettung in den Endpunkten sieht nicht gut aus, und es ist fehleranfällig. Für den Verbraucher habe ich fromF verwendet, und als zweiten Parameter gebe ich den Posteingang Ordner. Sie können es von einem konstanten Wert nehmen. Das Verzeichnis darf keine dynamischen Ausdrücke mit Platzhaltern $ {enthalten.
  2. Sie brauchen nicht .convertBodyTo (String.class)
  3. Für den Hersteller, den ich verwendet, D, die den outbox-Ordner von einer Eigenschaft übernimmt. Details sehen hier https://camel.apache.org/properties.html .Sie können fügen Sie eine Objekte im Ressourcen-Ordner-Datei (src/main/Ressourcen für ein Maven-Projekt) und laden sie in Kamel wie folgt aus (in einem Java-dsl routebuilder)

    PropertiesComponent pc = new PropertiesComponent(); pc.setLocation("classpath:application.properties"); getContext().addComponent("properties“, PC)

  4. Und schließlich das wichtigste, müssen Sie die Dateisprache nutzen und verwenden Sie die Datei: nomename: noext, um den ursprünglichen Namen der Zip-Datei ohne die Erweiterung zu erhalten. In Ihrem Fall abc.Details hier: https://camel.apache.org/file-language.html

0

Zum Kopieren des Dateipfads vom Hersteller zum Verbraucher kann file language verwendet werden.

So etwas wie

from("file:" + "</path/to/original>" + "?noop=true").noAutoStartup().routeId("xxx").split(new ZipSplitter()).streaming() 
      .convertBodyTo(String.class).to("$simple{file:path}")); 

(ursprünglich für die Filterung beantwortet basierend auf Dateiname)

zum Filtern nach Dateiname: - Sie filter können

So etwas wie

from("file:" + "</path/to/original>" + "?noop=true").noAutoStartup().routeId("xxx").fileFilter($org.apache.camel.Exchange.FILE_NAME.contains("xyz")).split(new ZipSplitter()).streaming() 
      .convertBodyTo(String.class).to("file:" + "</path/to/import>"); 

Auch, camel erlaubt Regex im Dateinamen selbst. So können Sie so etwas wie

from("file:" + "</path/to/original>" + "regex pattern in file name" + "?noop=true").noAutoStartup().routeId("xxx").split(new ZipSplitter()).streaming() 
      .convertBodyTo(String.class).to("file:" + "</path/to/import>"); 
+0

Vielen Dank für Ihre Antwort! Vielleicht war meine Frage nicht klar genug: Was ich tun möchte, ist etwa so: 'from (" Datei: "+" "+"? Noop = True "). NoAutoStartup(). routeId ("xxx"). split (neuer ZipSplitter()). streaming() .convertBodyTo (String.class) .to ("Datei:" + "" + ); ' –

0

Wenn Sie bei http://camel.apache.org/file2.html aussehen verwenden Sie, dass das Kamel Dateikomponente sehen einige Header setzt. Probieren Sie etwas wie

from("file:" + "</path/to/original>" + "?noop=true").noAutoStartup().routeId("xxx").split(new ZipSplitter()).streaming() 
     .convertBodyTo(String.class).to("file:" + "</path/to/import>" + header("CamelFileNameOnly"));