Apache Camel:处理后将消息放回原始位置

时间:2014-03-06 20:49:30

标签: java apache-camel

我使用Apache Camel的文件组件遇到了一个奇怪的障碍。问题的关键在于:我正在使用文件组件加载来自目录的所有消息。然后我使用处理器对加载的文件执行某些操作。如果该过程成功,则将文件移动到其他位置并删除原始文件。但是,如果进程失败,我会将消息保留在原始目录中。代码看起来像这样:

from("fileLocation")
   .process(new MessageProcessor())
   .choice()
       .when(header("processPassed").isEqualTo(true))
          .to("file:newLocation")
   .otherwise()
       .to("fileLocation");

如果处理器通过,那么一切都很好。但是,如果处理器出现故障并且我试图将消息返回到其原始位置,则无效。关于如何解决这个问题的任何想法?

2 个答案:

答案 0 :(得分:2)

我认为影响你的问题有两个。首先,您无法将文件写回原始位置,因为Camel正在处理它,其次存在您将重复处理同一文件的风险。要解决这个问题,您可以使用两个选项:

  1. preMove使用工作目录
  2. idempotent以防止第二次处理同一文件。
  3. 以下是我认为符合您需要的代码的略微修改版本

        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&amp;noop=true"/>
        <to uri="mock:result"/>
    </route>
</camelContext>