首页 文章

Apache Camel GenericFileOperationFailedException:'Cannot rename file' locks exchange

提问于
浏览
3

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

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

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

  • 通过FTP从源中获取文件,

  • 处理它们,smkss xsl转换

  • 通过FTP将生成的平面文件传送到 endpoints .

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

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

  • /export 目录中读取文件 dsciord_*.dat

  • 使用自定义 inprogressRepository 将读取的文件名存储到本地数据库中(这样做是为了防止第二个群集节点出现争用问题,但是,目前只有一个节点处于活动状态 . 此选项是不必要的,可以删除以加快进程) .

  • 将文件移动到 in_progress_bpo/201609061522 目录,其中子目录是基于date_timestamp创建的 .
    成功处理后,

  • 将它们移动到 in_progress_bpo/201609061522/done 子目录 .

在绝大多数情况下,路由没有问题,但是,有时文件无法移动到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]

注意:我们正在使用

  • ConsumerTemplate 的单个实例来处理我们的接口 .

  • 自定义 inprogressRepository 来存储读取的文件名 .

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

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

1 回答

  • 0

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

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

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

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

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

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

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

相关问题