【问题标题】:Multi-threaded file transfer to a FTP server多线程文件传输到 FTP 服务器
【发布时间】:2010-09-27 08:52:46
【问题描述】:

我正在为备份服务器编写客户端。 我的客户安排了一些文件夹进行备份。 (例如:每个星期五的 X 小时)。 我用于调度 cron4j(Linux cron 到 java 的端口)。

一切正常,直到我同时安排多个上传作业,然后由于多个线程而变得混乱。

谁能帮我解决多线程上传到 ftp 服务器的问题? (每个线程都有任务在 Ftp 服务器上上传一个目录)。

【问题讨论】:

    标签: java multithreading ftp


    【解决方案1】:

    你能解释一下你说它有点“混乱”是什么意思吗?有什么特别的症状吗?

    无论如何,从一张干净的表格来看,我会说您想限制一次执行的并发上传数量,否则您可能会在连接数方面达到某种限制FTP 服务器将允许单个客户端,或者客户端操作系统将允许的连接数。您的应用程序可能更多地受带宽而非 CPU 的约束,因此运行太多线程可能会适得其反。您实际上会一次上传更多项目,但吞吐量会降低。

    我假设你的应用程序有一组任务,它们关闭了 cron4j,这些任务然后获取一个目录并通过 FTP 上传,这听起来对吗?

    如果是这样,我建议将其分为几个阶段,首先 cron4j 启动构建一个可运行对象的任务,该对象在执行时将执行 FTP 上传,而不是执行上传本身的任务。将此可运行对象放入队列中(来自 java.util.concurrent 的阻塞队列是个好主意)。然后,您在线程池中运行了另一个任务的一些实例,这些任务将从队列中取出作业并执行它们(实验池中的线程数,看看什么能给您带来良好的吞吐量)。这将为您提供一组竞争消费者,您可以将其限制为并发上传的有效数量(例如,一次 4 个)。


    正如 cmets 中所述,SEDA 模式听起来很有趣。如果您打算使用 Java 进行任何并发编程,我建议您获取 Doug Lea 的“Java 中的并发编程:设计原则和模式”的副本,它不包括 Java 5 的东西,但其中大部分是基于什么无论如何,在书中。他清楚地解释了很多关于线程安全以及如何编写好的 Java 代码的问题。

    【讨论】:

    • Ben 的方法听起来很有效,很好地利用了 SEDA 模式(分阶段事件驱动架构)。
    • 抱歉这么晚才回答:)。我有一个实现 Runnable 的 AbstractTask 对象。我有一个从 AbstactTask 继承的 UploadTask 和一个 DownloadTask。因此,首先我构建了一个任务列表并遍历它们并使用 cron4j 安排每个任务。 Cron4j 启动每个上传/下载任务。
    【解决方案2】:

    ipworks FTP 类是线程安全的。您必须阅读 Brian Goetz 的 Java Concurrency in Practice ...

    public class ServerConnection extends Thread  {
    
    // the connection to the ftp server
    private final Ftp connection;
    

    如果您不喜欢自己管理线程,也可以实现 Runnable 并使用 executorService ...

    【讨论】:

      猜你喜欢
      • 2016-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-12
      • 2011-02-19
      • 1970-01-01
      相关资源
      最近更新 更多