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