我正在为备份服务器编写客户端。 我的客户安排一些文件夹进行备份。 (例如:每个星期五,小时X)。 我用于安排 cron4j (Linux cron到java的一个端口)。
一切顺利,直到我同时安排多个上传作业,然后由于多线程而变得混乱。
任何人都可以帮我解决多线程上传到ftp服务器的问题吗? (每个线程都有在Ftp服务器上上传目录的工作)。
答案 0 :(得分:1)
当你说它有点“凌乱”时,你能解释一下你的意思吗?有什么特别的症状吗?
无论如何从一张干净的表单中看到这一点我会说你想要限制你一次执行的并发上传数量,否则你可能会在连接数量方面遇到某种限制FTP服务器将允许单个客户端,或客户端操作系统允许的连接数。您的应用程序可能受限于带宽而不是CPU,因此运行太多线程可能会适得其反。您基本上可以一次上传更多项目,但吞吐量更低。
我认为应用程序有一组cron4j关闭的任务,然后这些任务占用一个目录并通过FTP上传,这听起来是对的吗?
如果是这样,我建议将其拆分为几个阶段,首先cron4j启动构造可运行对象的任务,执行该对象时将执行FTP上载而不是执行上载本身的任务。将此runnable放入队列中(来自java.util.concurrent的阻塞队列将是一个好主意)。然后,您有一些在线程池中运行的另一个任务的实例,这些任务将从队列中取出作业并执行它们(尝试池中的线程数以查看什么为您提供良好的吞吐量)。这将为您提供一组竞争消费者,您可以将其限制为有效的并发上传数量(例如,每次4个)。
正如评论中所指出的,SEDA模式听起来很有趣。如果您打算用Java进行任何并发编程,我建议获得Doug Lea的“Java并行编程:设计原则和模式”的副本,它不包括Java 5的东西,但大多数是基于什么的无论如何,在书中。他清楚地解释了许多关于线程安全以及如何编写优秀Java代码的问题。
答案 1 :(得分:0)
ipworks FTP类是线程安全的。你必须阅读Brian Goetz的实践中的Java Concurrency ......
public class ServerConnection extends Thread {
// the connection to the ftp server
private final Ftp connection;
或者你可以实现Runnable并使用executorService如果你不喜欢自己管理线程......