apache-camel - Apache Camel GenericFileOperationFailedException : 'Cannot rename file' locks exchange

标签 apache-camel filelock smooks

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

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

基本上,在由 quartz 调度程序触发的固定时间间隔内,路由:

  1. 通过 FTP 从源中获取文件,
  2. 处理它们,smooks + xsl 转换
  3. 通过 FTP 将生成的平面文件传送到端点。

如果从源目录中读取多个文件,则在处理之前将所有文件一起附加到一个临时文件中。

Camel FTP 配置使用以下 URL:

ftp://xxxx/export?antInclude=dsciord_*.dat&inProgressRepository=#warehouseIntegrationIdempotentRepository&preMove=in_progress_bpo/$simple{date:now:yyyyMMddHHmm}/$simple{file:name}&move=done&consumer.bridgeErrorHandler=true

  1. /export 目录读取文件 dsciord_*.dat
  2. 使用自定义 inprogressRepository 将读取的文件名存储到本地数据库中(这样做是为了防止与第二个集群节点的争用问题,但是,目前只有一个节点是事件的。这个选项是不必要的并且可以删除以加快该过程)。
  3. 将文件移动到 in_progress_bpo/201609061522 目录,其中子目录是根据 date_timestamp 创建的。
  4. 一旦成功处理,将它们移动到 in_progress_bpo/201609061522/done 子目录。

在绝大多数情况下,路径都没有问题,但是,有时文件无法移动到 done 文件夹(见下面的错误)。即使在这种情况下,路由有时会在下一个轮询周期继续成功,但是,在其他情况下,路由会进入一种状态,即使 quartz 调度程序触发了轮询,路由也无法检测到 source/export 目录中的任何文件即使那里有文件。

org.apache.camel.component.file.GenericFileOperationFailedException: Cannot rename file: RemoteFile[in_progress_bpo/201609060502/dsciord_3605752.dat] to: RemoteFile[in_progress_bpo/201609060502/done/dsciord_3605752.dat]

注意:我们正在使用

  1. ConsumerTemplate 的单个实例来处理我们的接口(interface)。
  2. 自定义 inprogressRepository 来存储读取的文件名。

显然,必须有一个系统锁定源文件,这会导致 Camel 路由停止处理更多文件。

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

最佳答案

我终于能够重现/识别问题。

假设我们使用相对路径将处理后的文件移动到成功通过 ftp 传输到目标服务器的位置:

../../../u/4gl_upload/warehouse_integration_2/trs-server/export/in_progress_bpo/201609081030/done

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

/u/4gl_upload/warehouse_integration_2/trs-server/u/4gl_upload/warehouse_integration_2/trs-server/export/in_progress_bpo/201609081030

这是使用选项 stepwise=false 复制的,这意味着它一步而不是逐步遍历子目录。

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

关于apache-camel - Apache Camel GenericFileOperationFailedException : 'Cannot rename file' locks exchange,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39361221/

相关文章:

java - 如何在主线程中保持 apache Camel 上下文处于 Activity 状态

java - 如何使用多线程使用Camel File Component Consumer

Java 文件锁 : How to Load Dynamic Library From Locked File?

java - 如果无论如何都会抛出 OverlappingFileLockException,那么在 FileChannel.lock 中等待的目的是什么?

java - Smooks EDI 解析 - 重复段

java - freemarker 模板和 smooks 中的注释

java - Apache Camel FTP 550 在 Linux 中删除文件时出错

spring - 如何使用mockito模拟bean进行camel路由测试spring bean

c++ - mutex 或 flock fcntl.h 只锁定写操作

java - 如何使用jboss7.x.1从类路径获取文件