我们有一个基于Camel v2.16.1的集成系统,该系统在Jboss v6 Linux平台上运行。有多个接口同时运行,每个接口具有不同的轮询速率。
我们间歇性地遇到了“无法重命名文件”的问题。 Camel无法备份到“完成”的问题。文件夹已成功处理并从FTP源传输文件。重新启动camel应用程序可以解决问题。
基本上,由石英调度程序触发的定期间隔,路径:
如果从源目录中读取多个文件,则在处理之前,所有文件都会附加在临时文件中。
Camel FTP配置使用以下URL:
ftp://xxxx/export?antInclude=dsciord_ * DAT&安培; inProgressRepository =#warehouseIntegrationIdempotentRepository&安培; preMove = in_progress_bpo / $简单{日期:现在:表示为yyyymmddhhmm} / $简单{文件:名称}&安培;举动=做&安培; consumer.bridgeErrorHandler =真< / p>
dsciord_*.dat
目录/export
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无法关闭输入流。我检查过,我们不会使用
org.milyn.templating.xslt.XslTemplateProcessor#bypass
方法,其中Smooks无法关闭基础输入流。
答案 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选项重现的,这意味着它在一个步骤中遍历子目录而不是逐步遍历。
仍然不知道最佳解决方案是什么。