簡體   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