【发布时间】:2010-09-27 08:52:46
【问题描述】:
我正在为备份服务器编写客户端。 我的客户安排了一些文件夹进行备份。 (例如:每个星期五的 X 小时)。 我用于调度 cron4j(Linux cron 到 java 的端口)。
一切正常,直到我同时安排多个上传作业,然后由于多个线程而变得混乱。
谁能帮我解决多线程上传到 ftp 服务器的问题? (每个线程都有任务在 Ftp 服务器上上传一个目录)。
【问题讨论】:
标签: java multithreading ftp
我正在为备份服务器编写客户端。 我的客户安排了一些文件夹进行备份。 (例如:每个星期五的 X 小时)。 我用于调度 cron4j(Linux cron 到 java 的端口)。
一切正常,直到我同时安排多个上传作业,然后由于多个线程而变得混乱。
谁能帮我解决多线程上传到 ftp 服务器的问题? (每个线程都有任务在 Ftp 服务器上上传一个目录)。
【问题讨论】:
标签: java multithreading ftp
你能解释一下你说它有点“混乱”是什么意思吗?有什么特别的症状吗?
无论如何,从一张干净的表格来看,我会说您想限制一次执行的并发上传数量,否则您可能会在连接数方面达到某种限制FTP 服务器将允许单个客户端,或者客户端操作系统将允许的连接数。您的应用程序可能更多地受带宽而非 CPU 的约束,因此运行太多线程可能会适得其反。您实际上会一次上传更多项目,但吞吐量会降低。
我假设你的应用程序有一组任务,它们关闭了 cron4j,这些任务然后获取一个目录并通过 FTP 上传,这听起来对吗?
如果是这样,我建议将其分为几个阶段,首先 cron4j 启动构建一个可运行对象的任务,该对象在执行时将执行 FTP 上传,而不是执行上传本身的任务。将此可运行对象放入队列中(来自 java.util.concurrent 的阻塞队列是个好主意)。然后,您在线程池中运行了另一个任务的一些实例,这些任务将从队列中取出作业并执行它们(实验池中的线程数,看看什么能给您带来良好的吞吐量)。这将为您提供一组竞争消费者,您可以将其限制为并发上传的有效数量(例如,一次 4 个)。
正如 cmets 中所述,SEDA 模式听起来很有趣。如果您打算使用 Java 进行任何并发编程,我建议您获取 Doug Lea 的“Java 中的并发编程:设计原则和模式”的副本,它不包括 Java 5 的东西,但其中大部分是基于什么无论如何,在书中。他清楚地解释了很多关于线程安全以及如何编写好的 Java 代码的问题。
【讨论】:
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 ...
【讨论】: