Apache camel Apache Camel GenericFileOperationFailedException:&x27;无法重命名文件';锁交换

Apache camel Apache Camel GenericFileOperationFailedException:&x27;无法重命名文件';锁交换,apache-camel,filelock,smooks,Apache Camel,Filelock,Smooks,我们有一个基于Camel v2.16.1的集成系统,它运行在Jboss v6 Linux平台上。有多个接口以不同的轮询速率同时运行 我们间歇性地遇到“无法重命名文件”问题,Camel无法备份到“已完成”文件夹,无法成功处理并从FTP源传输文件。重新启动camel应用程序修复了该问题 基本上,在quartz调度程序触发的固定时间间隔内,路由: 通过FTP从源文件中拾取文件 处理它们,smooks+xsl转换 通过FTP将生成的平面文件传递到端点 如果从源目录读取多个文件,则在处理之前,所有文件都会

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

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

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

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

    驼峰FTP配置使用以下URL:

    *.dat&inProgressRepository=#仓库集成dempotentrepository&preMove=正在进行中_bpo/$simple{date:now:yyyyMMddHHmm}/$simple{file:name}&move=done&consumer.bridgeErrorHandler=true

  • /export
    目录中读取文件
    dsciord.*.dat
  • 使用自定义
    inprogressRepository
    将读取的文件名存储到本地数据库中(这样做是为了防止与第二个群集节点发生争用问题,但是,当前只有一个节点处于活动状态。此选项是不必要的,可以删除以加快进程)
  • 将文件移动到一个
    进行中的\u bpo/201609061522
    目录,在该目录中根据日期时间戳创建子目录
  • 成功处理后,将其移动到
    进行中\u bpo/201609061522/done
    子目录
  • 在绝大多数情况下,路由工作没有问题,但是,有时无法将文件移动到“完成”文件夹(请参阅下面的错误)。即使在这种情况下,路由有时也可以在下一个轮询周期成功继续,但是,在其他情况下,即使quartz调度器触发轮询,路由也会进入一种状态,即即使存在文件,路由也无法检测到源/导出目录中的任何文件

    org.apache.camel.component.file.GenericFileOperationFailedException:无法将文件:RemoteFile[正在进行中的\u bpo/201609060502/dsciord\u 3605752.dat]重命名为:RemoteFile[正在进行中的\u bpo/201609060502/done/dsciord\u 3605752.dat]

    注:我们正在使用

  • 一个
    ConsumerTemplate
    的单个实例来处理我们的接口
  • 用于存储读取的文件名的自定义
    inprogressRepository
  • 显然,必须有一个系统锁定源文件,这会导致驼峰路由停止处理进一步的文件

    如果您对调试/解决此问题有任何想法/建议,我们将不胜感激。我在camel用户论坛上读到的问题似乎涉及到与Windows相关的部署,有时Smook无法关闭输入流。我查过了,我们不使用
    org.milyn.templating.xslt.XslTemplateProcessor#绕过Smooks无法关闭底层输入流的
    方法。

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

    考虑到我们正在使用相对路径将处理后的文件移动到目标服务器,一旦成功通过ftp发送到目标服务器:

    ../../../u/4gl\ u上传/仓库\集成\ u 2/trs服务器/导出/进行中\ u bpo/201609081030/完成

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

    /u/4gl\u上传/仓库集成\u 2/trs服务器/u/4gl\u上传/仓库集成\u 2/trs服务器/导出/进行中\u bpo/201609081030

    这是通过选项stepwise=false复制的,这意味着它在一个步骤中而不是一步一步地遍历子目录


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

    我最终没有使用Camel的ConsumerTemplate。而是使用从远程ftp服务器读取文件的自定义方法来解决此问题。更快、可靠,并且允许指定绝对路径!嗯。。恐怕是使用窗户的问题。