Apache Camel GenericFileOperationFailedException:'无法重命名文件'锁定交换

时间:2016-09-07 04:29:33

标签: apache-camel filelock smooks

我们有一个基于Camel v2.16.1的集成系统,该系统在Jboss v6 Linux平台上运行。有多个接口同时运行,每个接口具有不同的轮询速率。

我们间歇性地遇到了“无法重命名文件”的问题。 Camel无法备份到“完成”的问题。文件夹已成功处理并从FTP源传输文件。重新启动camel应用程序可以解决问题。

基本上,由石英调度程序触发的定期间隔,路径:

  1. 通过FTP从源中获取文件,
  2. 处理它们,smooks + xsl转换
  3. 通过FTP将生成的平面文件传送到端点。
  4. 如果从源目录中读取多个文件,则在处理之前,所有文件都会附加在临时文件中。

    Camel FTP配置使用以下URL:

      

    ftp://xxxx/export?antInclude=dsciord_ * DAT&安培; inProgressRepository =#warehouseIntegrationIdempotentRepository&安培; preMove = in_progress_bpo / $简单{日期:现在:表示为yyyymmddhhmm} / $简单{文件:名称}&安培;举动=做&安培; consumer.bridgeErrorHandler =真< / p>

    1. dsciord_*.dat目录
    2. 中读取文件/export
    3. 使用自定义inprogressRepository将读取的文件名存储到本地数据库中(这样做是为了防止第二个群集节点出现争用问题,但是,目前只有一个节点处于活动状态。此选项是不必要的,可以是删除加快过程。)。
    4. 将文件移动到in_progress_bpo/201609061522目录,其中子目录是根据date_timestamp创建的。
    5. 成功处理后将其移至in_progress_bpo/201609061522/done子目录。
    6. 在绝大多数情况下,路由都没有问题,但是,有时文件无法移动到done文件夹(请参阅下面的错误)。即使在这种情况下,路由有时可以在下一个轮询周期成功继续,但是,在其他情况下,路由进入状态,即使石英调度程序触发轮询,路由也无法检测源/导出目录中的任何文件即使那里有ARE文件。

        

      org.apache.camel.component.file.GenericFileOperationFailedException:无法将文件重命名为:RemoteFile [in_progress_bpo / 201609060502 / dsciord_3605752.dat]:RemoteFile [in_progress_bpo / 201609060502 / done / dsciord_3605752.dat]

      注意:我们正在使用

      1. 处理我们接口的ConsumerTemplate的单个实例。
      2. 自定义inprogressRepository以存储读取的文件名。
      3. 显然,必须有一个系统锁定源文件,这导致Camel路由停止处理更多文件。

        有关调试/解决此问题的任何想法/建议将不胜感激。我通过camel-users论坛阅读的问题似乎涉及与Windows相关的部署,有时Smooks无法关闭输入流。我检查过,我们不会使用 org.milyn.templating.xslt.XslTemplateProcessor#bypass方法,其中Smooks无法关闭基础输入流。

1 个答案:

答案 0 :(得分:0)

最后,我能够重现/识别问题。

鉴于我们正在使用相对路径将处理过的文件成功移动到目标服务器:

../../../ U / 4gl_upload / warehouse_integration_2 / TRS-服务器/出口/ in_progress_bpo / 201609081030 /完成

但是,由于某种原因,而不是遍历via正确的路径来移动已处理的文件,camel使用者从当前工作目录开始创建一个新的子目录树,这可能会很长,如下所示。因此问题。它不知道它在哪里,也不会自行重置。

/ U / 4gl_upload / warehouse_integration_2 / TRS-服务器/ U / 4gl_upload / warehouse_integration_2 / TRS-服务器/出口/ in_progress_bpo / 201609081030

这是使用stepwise = false选项重现的,这意味着它在一个步骤中遍历子目录而不是逐步遍历。

仍然不知道最佳解决方案是什么。