繁体   English   中英

如何等到从 Java 中的 ftp 服务器下载整个文件?

[英]How to wait until whole files is downloaded from ftp server in Java?

一个线程池正在从 FTP 服务器下载文件,另一个线程池正在从中读取文件。

在此处输入图像描述

两个线程池同时运行。 那么究竟会发生什么,我将举一个例子来解释你。

假设,我有一个包含 100 条记录的 csv 文件。

虽然 threadPool-1 正在下载并将其写入挂起文件夹中的文件,同时 threadpool-2 从该文件中读取内容,但假设在 1 秒内只能将 10 条记录写入 /pending 文件夹中的文件中,并且threadpool - 2 只读取 10 条记录。

ThreadPool - 2 不知道当前正在下载 90 条记录。 现在,threadPool - 2 不会读取 90 条记录,因为它不知道是否下载了整个文件。 阅读后,它将将该文件移动到另一个文件夹中。 因此,我的 90 条记录将继续进行。

我的问题是,如何等到整个文件被下载,然后只有 threadPool 2 可以从文件中读取内容。

另一件事是两个线程池都使用scheduleFixedRate方法并每 10 秒运行一次。

请指导我。

我是 Mark Rotteveel 的 #6 建议的粉丝(在上面的评论中):

  • 下载时使用临时名称,
  • 下载完成后重命名。

看起来像:

  • FTP 下载线程写入所有文件并添加一些扩展名 - 可能是.pending - 但您可以随意命名。
  • 下载文件时——比如some.pdf ——FTP 下载线程将文件写入some.pdf.pending
  • 当 FTP 下载线程完成文件时,最后一步是文件重命名操作——这是确保只有“完成”文件准备好处理的机制。 因此它将文件下载到some.pdf.pending ,然后在最后将其重命名为some.pdf
  • 阅读器线程查找文件,忽略匹配*.pending的任何内容

我已经使用这种方法构建了系统,并且效果很好。 相比之下,我还使用过更复杂的系统,这些系统试图跨线程进行协调,而且……那些通常不能很好地工作。

随着时间的推移,任何软件系统都会出现错误。 Edsger Dijkstra 很好地捕捉到了这一点:

“如果调试是消除软件错误的过程,那么编程一定是把它们放进去的过程。”

无论现在要推理程序的正确性是多么困难——当程序仍处于设计阶段,尚未构建时——当产品在生产中出现问题时,推理正确性将更加困难(这将发生,因为错误)。 也就是说,当事情被打破并且您面临时间压力来寻找根本原因(并修复它)时。 即使是我们中最好的人也会在复杂(相对于简单)的系统中处于劣势。

使用临时名称的方法很容易推理,它应该最大限度地降低代码复杂性,从而使其更易于实现。 反过来,维护和错误修复也应该更容易。

保持简单——让文件系统帮助你。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM