我们有一个基于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 回答
最后,我能够重现/识别问题 .
鉴于我们使用相对路径将处理过的文件成功移动到目标服务器:
../../../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选项重现的,这意味着它在一个步骤中遍历子目录而不是逐步遍历 .
仍然不知道最佳解决方案是什么 .