68.3. unmarshal


在本例中,我们将名为 MY_QUEUE 的 ActiveMQ 队列中的 Zip 文件有效负载解压缩到其原始格式,并将它转发到 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();

68.3.1. 聚合

注意

此聚合策略需要 eager 完成检查才能正常工作。

在这个示例中,我们将输入目录中找到的所有文本文件聚合到存储在输出目录中的单个 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");
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.