Java中的并发通用文件下载

时间:2014-01-03 20:50:35

标签: java concurrency io download

我正在处理并发文件下载过程,但不确定采取何种方法。

关于:

应用程序将一堆文件捆绑在一起形成一个zip文件。这些文件通常位于硬盘驱动器的公共位置(例如/ tmp)。但是,有些情况下文件不存在,需要从远程http服务器下载。

问题:

  • 如何同时下载多个文件并确保没有其他线程(捆绑文件)同时下载同一个文件?

  • 此外,我如何确保在多个应用程序同时运行的情况下(请记住这些文件都位于一个公共位置),应用程序的任何实例都不会同时下载同一个文件时间

请描述策略,也许是实施策略的方法。或许解决上述问题已经存在。

谢谢!

2 个答案:

答案 0 :(得分:1)

这是一个可能的策略:

  1. 在单个应用程序的情况下:有一些调度程序线程从队列中读取工作(可能是一些持久化队列,就像DB表或其他),并为从每个项目中读取的每个项目生成新线程队列。通过阅读我的意思是,从队列中读取和删除

  2. 将该队列存储在共享数据库(或任何共享存储)中。在这种情况下,可能有一个单独的单个调度程序应用程序,它只读取数据库中的工作或工作部分,并为工作者应用程序提供工作。因此,每个工作者应用程序都要求调度程序应用程序工作,这可确保只有调度程序应用程序从数据库(或您决定使用的其他中央存储)读取。这反过来又消除了同步数据库(永久存储)访问的需要。

答案 1 :(得分:1)

  1. 您可以使用队列或数据库下载所需的文件,只需保留一个 'status'列和一个线程将文件标记为'fetching'。什么时候 完成它将设置为'完成'。保留最后一次更改时间戳,如果是 文件正在下载很长时间,停止或重新开始下载。

  2. 将此数据库用于此文件队列可能会确保其他应用程序 不要多次获取同一个文件(也许是持久下载 等等;)。您也可以运行多个下载,db可以 用于跟踪下载速度,进度等;

  3. 将来您的问题应该使用特定代码,特定问题进行格式化。您的问题非常广泛,并提出了一个讨论(更适合聊天)与其他人可能使用的单个答案。