我使用Apache Camel的文件组件遇到了一个奇怪的障碍。问题的关键在于:我正在使用文件组件加载来自目录的所有消息。然后我使用处理器对加载的文件执行某些操作。如果该过程成功,则将文件移动到其他位置并删除原始文件。但是,如果进程失败,我会将消息保留在原始目录中。代码看起来像这样:
from("fileLocation")
.process(new MessageProcessor())
.choice()
.when(header("processPassed").isEqualTo(true))
.to("file:newLocation")
.otherwise()
.to("fileLocation");
如果处理器通过,那么一切都很好。但是,如果处理器出现故障并且我试图将消息返回到其原始位置,则无效。关于如何解决这个问题的任何想法?
答案 0 :(得分:2)
我认为影响你的问题有两个。首先,您无法将文件写回原始位置,因为Camel正在处理它,其次存在您将重复处理同一文件的风险。要解决这个问题,您可以使用两个选项:
preMove
使用工作目录idempotent
以防止第二次处理同一文件。以下是我认为符合您需要的代码的略微修改版本
from("file:fileLocation?idempotent=true&preMove=working")
.process(new MessageProcessor())
.choice()
.when(header("processPassed").isEqualTo(true))
.to("file:newLocation")
.otherwise()
.to("file:fileLocation");
File Endpoint文档中提供了更多详细信息。
答案 1 :(得分:1)
阅读documentation,您可以指定moveFailed
选项。
将文件放在某个错误文件夹中,而不是原始位置是一件好事。然后你就会知道在哪里寻找坏文件。
<强>更新强> 由于您需要将文件保留在原位,因此需要设置持久的幂等存储库。
这主要是从文档中复制的,并且会将已处理文件的绝对文件路径保存到磁盘上的文件中 - 这样它就不会再次处理相同的文件名。
<!-- this is our file based idempotent store configured to use the .filestore.dat as file -->
<bean id="fileStore" class="org.apache.camel.processor.idempotent.FileIdempotentRepository">
<!-- the filename for the store -->
<property name="fileStore" value="some/folder/.idempotentrepo/filestore.dat"/>
<!-- the max filesize in bytes for the file.-->
<property name="maxFileStoreSize" value="<some size>"/>
</bean>
<camelContext xmlns="http://camel.apache.org/schema/spring">
<route>
<from uri="file://some/folder/?idempotentRepository=#fileStore&noop=true"/>
<to uri="mock:result"/>
</route>
</camelContext>