如何轮询目录而不是达到文件传输竞争条件?

时间:2015-07-02 21:07:23

标签: java filesystems race-condition polling

我正在开发一个应用程序,它以定义的间隔轮询目录以获取新的输入文件。一般过程是:

  1. 输入文件FTP到另一个应用程序的着陆带目录
  2. 我们的应用程序醒来
  3. 列出输入目录中的文件
  4. Atomic-将文件移动到单独的临时目录
  5. 启动工作线程(通过工作分发队列)来使用暂存目录中的文件
  6. 回去睡觉
  7. 我发现了一个问题,应用程序会在输入文件不完整且仍处于传输过程中时选择输入文件,从而导致工作线程错误,需要手动干预。这是我们需要避免的情景。

    我应该注意文件传输将成功完成,服务器将获得完整的副本,但这会在应用程序因错误而放弃后发生。

    我想以干净的方式解决这个问题,虽然我有一些解决方案的想法,但他们都有我不喜欢的问题。

    以下是我所考虑的内容:

    1. 强制其他应用程序(其中一些是我们公司的外部)最初将输入文件传输到保留目录,然后在传输后将它们原子移动到输入目录中。这是我所拥有的最强大的想法,但我不喜欢这样,因为我不相信它会一直正确实施。
    2. 出错时重试有限次数。我不喜欢这样,因为它是一个部分解决方案,它会对可能违反的传输时间和文件大小做出假设。它还会模糊真正糟糕的文件和刚刚未完全传输的文件之间的界限。
    3. 观看文件大小,只有在文件大小未定义的时间段内更改时才会选择文件。我不喜欢这样,因为它在我们的环境中太复杂了:轮询器是一个非并发的集群Quartz作业,因此我不能仅仅将这些信息保存在内存中,因为作业可以在两者之间反弹服务器。我可以将它存储在jobdetail中,但这个解决方案感觉太复杂了。
    4. 我不能成为第一个遇到此问题的人,所以我相信我会在这里得到更好的想法。

1 个答案:

答案 0 :(得分:3)

我曾经遇到过这种情况,我们让其他人加载具有不同扩展名的文件,例如* .tmp,然后在文件复制完成后,他们使用我的代码轮询的扩展名重命名该文件。不确定当文件通过FTP tho进入时是否轻松完成。