65.3. unmarshal
在本例中,我们将 Zip 文件有效负载从名为 MY_QUEUE 的 ActiveMQ 队列继承到其原始格式,并将它转发到 UnZippedMessageProcessor
。
from("activemq:queue:MY_QUEUE") .unmarshal().zipFile() .process(new UnZippedMessageProcessor());
如果 zip 文件有多个条目,则 ZipFileDataFormat 的 usingIterator 选项为 true,您可以使用 splitter 来进一步工作。
ZipFileDataFormat zipFile = new ZipFileDataFormat(); zipFile.setUsingIterator(true); from("file:src/test/resources/org/apache/camel/dataformat/zipfile/?delay=1000&noop=true") .unmarshal(zipFile) .split(body(Iterator.class)).streaming() .process(new UnZippedMessageProcessor()) .end();
或者,您可以将 ZipSplitter 用作分割器的表达式,如下所示
from("file:src/test/resources/org/apache/camel/dataformat/zipfile?delay=1000&noop=true") .split(new ZipSplitter()).streaming() .process(new UnZippedMessageProcessor()) .end();
65.3.1. 聚合
注意
此聚合策略需要强制完成检查才能正常工作。
在这个示例中,我们将输入目录中找到的所有文本文件聚合到存储在输出目录中的单个 Zip 文件中。
from("file:input/directory?antInclude=*/.txt") .aggregate(constant(true), new ZipAggregationStrategy()) .completionFromBatchConsumer().eagerCheckCompletion() .to("file:output/directory");
传出的 CamelFileName
消息标头使用 java.io.File.createTempFile 创建,并带有 ".zip" 后缀。如果要覆盖此行为,您可以在路由中明确设置 CamelFileName
标头的值:
from("file:input/directory?antInclude=*/.txt") .aggregate(constant(true), new ZipAggregationStrategy()) .completionFromBatchConsumer().eagerCheckCompletion() .setHeader(Exchange.FILE_NAME, constant("reports.zip")) .to("file:output/directory");