繁体   English   中英

多线程文件传输到FTP服务器

[英]Multi-threaded file transfer to a FTP server

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

一切都很好,直到我同时安排多个上传作业,然后由于多线程它变得混乱。

任何人都可以帮我解决多线程上传到ftp服务器的问题吗? (每个线程都有上传Ftp服务器上的目录的工作)。

当你说它有点“凌乱”时,你能解释一下你的意思吗? 任何特殊症状?

无论如何从一张干净的表单中查看这个我会说你想要限制你一次执行的并发上传数量,否则你可能会遇到某种限制,就FTP服务器的连接数而言允许单个客户端,或客户端操作系统允许的连接数。 您的应用程序可能受限于带宽而不是CPU,因此运行太多线程可能会适得其反。 您基本上可以一次上传更多项目,但吞吐量更低。

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

如果是这样,我建议将其拆分为几个阶段,首先cron4j启动构造可运行对象的任务,该对象在执行时将执行FTP上载而不是执行上载本身的任务。 将此runnable放入队列中(来自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如果你不喜欢自己管理线程...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM