【问题标题】:Data loss on concurrent file write in camel骆驼并发文件写入的数据丢失
【发布时间】:2015-06-01 17:16:16
【问题描述】:

我正在使用骆驼技术进行文件操作。我的系统是集群环境。

Let say,  I have 4 instances  
Instance A 
Instance B 
Instance C 
Instance D

文件夹结构

输入文件夹:C:/app/input

输出文件夹:C:/app/output

所有四个实例都将指向输入文件夹位置。根据,我的业务 8 个文件将放在输入文件夹中,输出将被合并文件。这里骆驼在同时写入输出文件时丢失数据。

路线:

 from("file://C:/app/input")
 .setHeader(Exchange.File_Name,simple("output.txt"))
 .to("file://C:/app/output?fileExist=Append")
 .end();

请帮我解决这个问题。有没有像骆驼写锁这样的东西?以避免并发文件编写器。提前致谢

【问题讨论】:

  • 据我了解,这些输入文件夹应该分别位于每个实例中,输出文件夹也相同?
  • 没有输入输出是挂载位置。所有 4 个实例共享同一个位置。
  • 据我了解,当我们在该位置放置 8 个文件时,4 个实例中的每一个都将开始处理。因此,文件 1 将由实例 1 处理,文件 2 将由实例 2 处理,依此类推。在这种情况下,每个实例将单独处理文件并尝试更新相同的文件名,并且第一个访问锁定它。这会导致另一个实例出错,只是不更新​​文件。我说的对吗?
  • 我不确定骆驼在写入文件时是否使用锁。我是骆驼的新手。但每次我得到不同的记录数。假设每个文件有 1000 条记录,那么最终输出文件中的实际输出为 8000。但每次运行我得到不同的输出计数。
  • 在这种情况下,最好使用 aggregator2 组件,因为您正在从一个目录中读取多个文件并创建一个文件输出。为此使用聚合和完成谓词。参考:stackoverflow.com/questions/28339303/…

标签: apache-camel


【解决方案1】:

您可以使用文件组件的 doneFile 选项,有关详细信息,请参阅http://camel.apache.org/file2.html

避免读取当前正在由另一个应用程序写入的文件

请注意,JDK 文件 IO API 在检测另一个应用程序当前是否正在写入/复制文件方面有点受限。并且实现也可能因操作系统平台而异。这可能导致 Camel 认为该文件没有被另一个进程锁定并开始使用它。因此,您必须自己调查适合您的环境的内容。为了帮助解决这个问题,Camel 提供了不同的 readLock 选项和 doneFileName 选项,您可以使用它们。另请参阅使用其他人直接放置文件的文件夹中的文件部分。

【讨论】:

    猜你喜欢
    • 2013-02-07
    • 1970-01-01
    • 2021-01-25
    • 1970-01-01
    • 1970-01-01
    • 2020-05-16
    • 2017-01-03
    • 2022-01-11
    • 1970-01-01
    相关资源
    最近更新 更多