首页 > 解决方案 > Apache Camel 解压、处理和聚合未完成

问题描述

我正在尝试处理一个 zip 文件,其中包含几个文件(都很小,所以在内存中工作不是问题),需要再次转换和压缩在一起。

我设法解压缩,转换文件,但由于某种原因,拆分器没有完成,只使用completionTimeout使聚合器创建最终的 zip 存档。

这是路线:

<route id="ZipFile">
    <from uri="file:{{file.path.in}}?move=.done&amp;moveFailed=.error&amp;readLock=rename"/>

    <setProperty propertyName="OriginalZipName">
        <simple>${header.CamelFileName}</simple>
    </setProperty>

    <unmarshal>
        <zipFile usingIterator="true"/>
    </unmarshal>

    <split streaming="true">
        <simple>${body}</simple>

        <log message="************ CamelSplitComplete = ${property.CamelSplitComplete}"/>

        <to uri="direct:ProcessUnzippedFile"/>

        <setHeader headerName="CamelFileName">
            <simple>${property.OriginalZipName}</simple>
        </setHeader>

        <!-- Aggregate to zip -->
        <aggregate strategyRef="zipAggregationStrategy" eagerCheckCompletion="true">
            <correlationExpression>
                <constant>true</constant>
            </correlationExpression>
            <completionPredicate>
                <simple>${property.CamelSplitComplete}</simple>
            </completionPredicate>
            <setHeader headerName="CamelFileName">
                <simple>${property.OriginalZipName}</simple>
            </setHeader>
            <to uri="file://{{file.path.out}}"/>
        </aggregate>
    </split>

</route>

知道可能是什么问题吗?

标签: apache-camel

解决方案


Camel Splitter 提供了一个内置的聚合器,这使得将拆分的消息聚合回单个传出消息变得更加容易

您必须在拆分定义中定义聚合策略

<split strategyRef="zipAggregationStrategy">

还没有在 XML 中尝试过,但在 Java DSL 中,这是我的示例之一。

  .unmarshal(zipFile)
                .split(bodyAs(Iterator.class),new ZipAggregationStrategy(true,true))
                .streaming()
                .stopOnException()
                .to("direct:transform-ticket")
                .end();

推荐阅读