【问题标题】:Using ZipSplitter in Apache Camel Spring DSL在 Apache Camel Spring DSL 中使用 ZipSplitter
【发布时间】:2014-07-16 06:33:42
【问题描述】:
我想知道如何在 Spring DSL 中使用 camel-zipfile 中的 ZipSplitter。我一直在尝试基于这篇文章Unzip a file using Apache Camel UnZippedMessageProcessor 的不同方法,但我无法弄清楚如何在 Spring 中进行操作。另外,我还没有找到任何关于这方面的例子。
我有这样的事情:
<bean id="zipSplitter" class="org.apache.camel.dataformat.zipfile.ZipSplitter" />
...
<split streaming="true" parallelProcessing="true">
<?????>
<convertBodyTo type="java.lang.String" />
<to uri="file:foo" />
</split>
感谢您的帮助!
【问题讨论】:
标签:
java
spring
zip
apache-camel
【解决方案1】:
你可以像这样使用来保存表达式的引用
<bean id="zipSplitter" class="org.apache.camel.dataformat.zipfile.ZipSplitter" />
...
<split streaming="true" parallelProcessing="true">
<ref>zipSplitter</ref>
<convertBodyTo type="java.lang.String" />
<to uri="file:foo" />
</split>
【解决方案2】:
使用 Camel 2.13.0,使用 parallelProcessing="true" 并解压缩包含 10 个 xml 文件的 .zip 文件,每个文件大约 10Kb,它会引发几个异常:
原因:java.util.zip.ZipException:无效距离太远
在 java.util.zip.InflaterInputStream.read(InflaterInputStream.java:164) ~[na:1.7.0_55]
在 java.util.zip.ZipInputStream.read(ZipInputStream.java:193) ~[na:1.7.0_55]
在 java.io.BufferedInputStream.read1(BufferedInputStream.java:273) ~[na:1.7.0_55]
在 java.io.BufferedInputStream.read(BufferedInputStream.java:334) ~[na:1.7.0_55]
在 java.io.FilterInputStream.read(FilterInputStream.java:107) ~[na:1.7.0_55]
在 org.apache.camel.component.file.FileOperations.writeFileByStream(FileOperations.java:375) ~[camel-core-2.13.0.jar:2.13.0]
然后重试:
原因:java.io.IOException:流已关闭
在 java.util.zip.ZipInputStream.ensureOpen(ZipInputStream.java:66) ~[na:1.7.0_55]
在 java.util.zip.ZipInputStream.read(ZipInputStream.java:181) ~[na:1.7.0_55]
在 java.io.BufferedInputStream.read1(BufferedInputStream.java:273) ~[na:1.7.0_55]
在 java.io.BufferedInputStream.read(BufferedInputStream.java:334) ~[na:1.7.0_55]
在 java.io.FilterInputStream.read(FilterInputStream.java:107) ~[na:1.7.0_55]
在 org.apache.camel.component.file.FileOperations.writeFileByStream(FileOperations.java:375) ~[camel-core-2.13.0.jar:2.13.0]
我找到了解决方法,删除 parallelProcessing="true" 属性:
<route id="ConsumeZipFiles">
<from uri="file:src/test/resources/input/zip?noop=true&delay=30000" />
<split streaming="true">
<ref>zipSplitter</ref>
<to uri="file:target/output" />
</split>
</route>