当前位置: 首页 > 知识库问答 >
问题:

Apache Camel GenericFileOperationFailedException:“无法重命名文件”锁定exchange

隆礼骞
2023-03-14

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

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

基本上,在quartz调度器触发的定期时间间隔内,路由:

    null

ftp:/xxxx/export?antinclude=dsciord_*.dat&inprogressrepository=#warehouseintegrathtml" target="_blank">ionidempotentrepository&premove=in_progress_bpo/$simple{date:now:yyyymmddhhmm}/$simple{file:name}&move=done&consumer.bridgeerrorhandler=true

  1. /export目录
  2. 读取文件 DSCIORD_*.dat
  3. 使用自定义InProgressRepository将读取的文件名存储到本地db中(这样做是为了防止与第二个群集节点的争用问题,但是,当前只有一个节点处于活动状态。此选项是不必要的,可以删除以加快进程)。
  4. 将文件移动到in_progress_bpo/201609061522目录,在该目录中根据date_timestamp创建子目录。
  5. 成功处理后,将它们移动到in_progress_bpo/201609061522/done子目录。

在绝大多数情况下,路由工作时没有任何问题,但是,有时文件无法移动到done文件夹(请参见下面的错误)。即使在这种情况下,路由有时可以在下一轮询周期成功地继续,然而,在其他情况下,路由进入一种状态,即即使quartz调度器触发轮询,路由也无法检测到源/导出目录中的任何文件,即使那里有文件。

org.apache.camel.component.file.GenericFileOperationFailedException:无法将文件:RemoteFile[IN_Progress_BPO/201609060502/DSCIORD_3605752.dat]重命名为:RemoteFile[IN_Progress_BPO/201609060502/DONE/DSCIORD_3605752.dat]

注意:我们正在使用

  1. 用于处理接口的ConsumerTemplate的单个实例。
  2. 用于存储读取的文件名的自定义InProgressRepository

显然,必须有一个系统锁定源文件,这导致骆驼路由停止处理进一步的文件。

任何关于调试/解决此问题的想法/建议都将不胜感激。我在camel-users论坛上看到的问题似乎涉及到与Windows相关的部署,有时会遇到无法关闭输入流的问题。我已经检查过,我们没有使用org.milyn.templating.xslt.XSLTemplateProcessor#bypass方法,在该方法中,Smoks无法关闭底层输入流。

共有1个答案

苗运珧
2023-03-14

我终于能够再现/识别出这个问题。

假设我们正在使用一个相对路径将处理过的文件移动到目标服务器(一旦ftp-ed成功):

../../../U/4GL_Upload/Warehouse_Integration_2/TRS-Server/Export/In_Progress_BPO/201609081030/Done

/u/4gl_upload/Warehouse_Integration_2/TRS-Server/u/4gl_upload/Warehouse_Integration_2/TRS-Server/Export/In_Progress_BPO/201609081030

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

还是不知道什么是最好的解决办法

 类似资料:
  • 文件重命名 文件重命名 源码/* * Copyright (c) 2006-2018, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * *//* * 程序清单:更改名称 * * 程序会创建一个操作文件的函数并导出到msh命令列表 * 在

  • null 为什么我不能重命名文件,或者我做错了什么?

  • 问题内容: 我想批量重命名目录中的多个文件,以便从文件名中删除前面的数字和连字符。 如何使用linux命令执行此操作? 问题答案: 这应该使它: 它从块的开头(即数字)开始多次,然后连字符并将其从文件名中删除。 如果不在您的计算机中,则可以使用循环和: 测试 要么:

  • 我正在使用ApacheCamel文件组件从本地目录读取数据并上传到AWS S3存储桶。这条路线在过去工作得很完美,但现在每天都有一些文件出现问题。 在我迄今为止的调试调查(3天的痛苦)中,我发现该路由到达了类,并且在交换上没有设置任何异常(供参考,请参阅下面前面提到的类的相关代码)。考虑到没有任何异常,我似乎无法弄清楚为什么方法从不针对特定文件触发。有问题的文件没有/没有任何异常;但是,在所有逻辑

  • 问题内容: 是否有用于命名jar文件的任何行业标准约定? 问题答案: 我一直在用 哪里: M = (在不必保持向后兼容性时更改) m = (功能添加等) b = (对于包含错误修复的版本)

  • 我一直在使用PDF文件中的命名目标来打开文件中特定位置的PDF文件。负责生成PDF文档的团队使用工具从图书标记自动生成命名目的地,因此命名目的地的名称往往类似于*9\u Glossary*或*Additional\u Information*。我们被要求用多种语言制作相同的文档。我预计我们将收到多种外语的PDF文档,在相同的位置带有书签,但图书标记的名称当然将使用这些其他语言,自动生成的命名目的地