【问题标题】:How to lock writing file so other consumer can't consume如何锁定写入文件以使其他消费者无法使用
【发布时间】:2018-05-10 14:42:33
【问题描述】:

我正在使用骆驼替换文件中的数据(它是 400 MB 的大文件) 即使文件正在使用(它处于写入模式),我也面临其他消费者拾取文件的问题。

骆驼有没有办法锁定处于写入模式的文件,这样另一个消费者/路线就不能消费了。它应该在写入完成后消耗。 我尝试使用 readLocks,但到目前为止没有运气。

from("file://A").split().tokenize("\n", 999).streaming()
.log("Spliting::::::::::").unmarshal(csv).bean("transferDate", "enrich")
.marshal(csv).to("file://B?fileExist=Append");

from("file://B?delete=true").to("file://A"); // this route pick up file even the first route haven't finished writing file completely

【问题讨论】:

  • 您是否有特定的业务案例需要 fileExist=Append 在您的第一条路线中并在第二条路线中删除它。我建议在第一条路线 fileExist=Override 并使用 tempFileName=tmpFile_${file:name} 以便写入临时文件。或者您可以在第一条路线中使用 doneFileName 选项,并在第二条路线中在 doneFileName 存在时选择文件。
  • @Neeraj :我需要 fileExist=Append 因为我在 999 的卡盘中写入数据,我这样做是因为它是一个非常大的文件。我尝试使用 tempFileName 但它不起作用,因为 Camel 不允许(fileExist 和 tempFileName)一次使用这两个选项
  • 本题要求与this非常接近

标签: java apache-camel spring-camel


【解决方案1】:

您可以使用完成的文件。如果您在文件使用者上配置它们,它会忽略所有文件,直到在真实文件旁边有一个完成(或标记)文件。

您还可以配置文件生产者来创建完成的文件。

查看Camel Docs for File component 并完成章节Using done files

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-26
    • 1970-01-01
    • 1970-01-01
    • 2018-12-14
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    相关资源
    最近更新 更多