| [[tarfile-dataformat]] |
| == Tar File DataFormat |
| |
| *Available as of Camel version 2.16* |
| |
| The Tar File Data Format is a message compression |
| and de-compression format. Messages can be marshalled (compressed) to |
| Tar Files containing a single entry, and Tar Files containing a single |
| entry can be unmarshalled (decompressed) to the original file contents. |
| |
| There is also a aggregation strategy that can |
| aggregate multiple messages into a single Tar File. |
| |
| ### TarFile Options |
| |
| |
| // dataformat options: START |
| The Tar File dataformat supports 4 options, which are listed below. |
| |
| |
| |
| [width="100%",cols="2s,1m,1m,6",options="header"] |
| |=== |
| | Name | Default | Java Type | Description |
| | usingIterator | false | Boolean | If the tar file has more then one entry, the setting this option to true, allows to work with the splitter EIP, to split the data using an iterator in a streaming mode. |
| | allowEmptyDirectory | false | Boolean | If the tar file has more then one entry, setting this option to true, allows to get the iterator even if the directory is empty |
| | preservePathElements | false | Boolean | If the file name contains path elements, setting this option to true, allows the path to be maintained in the tar file. |
| | contentTypeHeader | false | Boolean | Whether the data format should set the Content-Type header with the type from the data format if the data format is capable of doing so. For example application/xml for data formats marshalling to XML, or application/json for data formats marshalling to JSon etc. |
| |=== |
| // dataformat options: END |
| |
| |
| ### Marshal |
| |
| In this example we marshal a regular text/XML payload to a compressed |
| payload using Tar File compression, and send it to an ActiveMQ queue |
| called MY_QUEUE. |
| |
| [source,java] |
| ----------------------------------------------------------------------- |
| from("direct:start").marshal().tarFile().to("activemq:queue:MY_QUEUE"); |
| ----------------------------------------------------------------------- |
| |
| The name of the Tar entry inside the created Tar File is based on the |
| incoming `CamelFileName` message header, which is the standard message |
| header used by the file component. Additionally, the |
| outgoing `CamelFileName` message header is automatically set to the |
| value of the incoming `CamelFileName` message header, with the ".tar" |
| suffix. So for example, if the following route finds a file named |
| "test.txt" in the input directory, the output will be a Tar File named |
| "test.txt.tar" containing a single Tar entry named "test.txt": |
| |
| [source,java] |
| ----------------------------------------------------------------------------------------------- |
| from("file:input/directory?antInclude=*/.txt").marshal().tarFile().to("file:output/directory"); |
| ----------------------------------------------------------------------------------------------- |
| |
| If there is no incoming `CamelFileName` message header (for example, if |
| the file component is not the consumer), then the |
| message ID is used by default, and since the message ID is normally a |
| unique generated ID, you will end up with filenames like |
| `ID-MACHINENAME-2443-1211718892437-1-0.tar`. If you want to override |
| this behavior, then you can set the value of the `CamelFileName` header |
| explicitly in your route: |
| |
| [source,java] |
| --------------------------------------------------------------------------------------------------------------------------- |
| from("direct:start").setHeader(Exchange.FILE_NAME, constant("report.txt")).marshal().tarFile().to("file:output/directory"); |
| --------------------------------------------------------------------------------------------------------------------------- |
| |
| This route would result in a Tar File named "report.txt.tar" in the |
| output directory, containing a single Tar entry named "report.txt". |
| |
| ### Unmarshal |
| |
| In this example we unmarshal a Tar File payload from an ActiveMQ queue |
| called MY_QUEUE to its original format, and forward it for processing to |
| the `UnTarpedMessageProcessor`. |
| |
| [source,java] |
| ----------------------------------------------------------------------------------------------- |
| from("activemq:queue:MY_QUEUE").unmarshal().tarFile().process(new UnTarpedMessageProcessor()); |
| ----------------------------------------------------------------------------------------------- |
| |
| If the Tar File has more then one entry, the usingIterator option of |
| TarFileDataFormat to be true, and you can use splitter to do the further |
| work. |
| |
| [source,java] |
| ---------------------------------------------------------------------------------------------------- |
| TarFileDataFormat tarFile = new TarFileDataFormat(); |
| tarFile.setUsingIterator(true); |
| from("file:src/test/resources/org/apache/camel/dataformat/tarfile/?consumer.delay=1000&noop=true") |
| .unmarshal(tarFile) |
| .split(body(Iterator.class)) |
| .streaming() |
| .process(new UnTarpedMessageProcessor()) |
| .end(); |
| ---------------------------------------------------------------------------------------------------- |
| |
| Or you can use the TarSplitter as an expression for splitter directly |
| like this |
| |
| [source,java] |
| ---------------------------------------------------------------------------------------------------- |
| from("file:src/test/resources/org/apache/camel/dataformat/tarfile?consumer.delay=1000&noop=true") |
| .split(new TarSplitter()) |
| .streaming() |
| .process(new UnTarpedMessageProcessor()) |
| .end(); |
| ---------------------------------------------------------------------------------------------------- |
| |
| |
| ### Aggregate |
| |
| INFO:Please note that this aggregation strategy requires eager completion |
| check to work properly. |
| |
| In this example we aggregate all text files found in the input directory |
| into a single Tar File that is stored in the output directory. |
| |
| [source,java] |
| ------------------------------------------------- |
| from("file:input/directory?antInclude=*/.txt") |
| .aggregate(new TarAggregationStrategy()) |
| .constant(true) |
| .completionFromBatchConsumer() |
| .eagerCheckCompletion() |
| .to("file:output/directory"); |
| ------------------------------------------------- |
| |
| The outgoing `CamelFileName` message header is created using |
| java.io.File.createTempFile, with the ".tar" suffix. If you want to |
| override this behavior, then you can set the value of |
| the `CamelFileName` header explicitly in your route: |
| |
| [source,java] |
| ------------------------------------------------------------ |
| from("file:input/directory?antInclude=*/.txt") |
| .aggregate(new TarAggregationStrategy()) |
| .constant(true) |
| .completionFromBatchConsumer() |
| .eagerCheckCompletion() |
| .setHeader(Exchange.FILE_NAME, constant("reports.tar")) |
| .to("file:output/directory"); |
| ------------------------------------------------------------ |
| |
| ### Dependencies |
| |
| To use Tar Files in your camel routes you need to add a dependency on |
| *camel-tarfile* which implements this data format. |
| |
| If you use Maven you can just add the following to your `pom.xml`, |
| substituting the version number for the latest & greatest release (see |
| the download page for the latest versions). |
| |
| [source,xml] |
| ---------------------------------------------------------- |
| <dependency> |
| <groupId>org.apache.camel</groupId> |
| <artifactId>camel-tarfile</artifactId> |
| <version>x.x.x</version> |
| <!-- use the same version as your Camel core version --> |
| </dependency> |
| ---------------------------------------------------------- |