2008-12-17 103 views
3

我正在爲備份服務器編寫客戶端。 我的客戶端安排了一些文件夾進行備份。 (例如:X小時的每個星期五)。 我正在使用調度cron4j(Linux cron的一個端口到java)。將多線程文件傳輸到FTP服務器

一切都很好,直到我安排了多個上傳作業,然後由於多個線程變得混亂。

任何人都可以幫我解決多線程上傳到FTP服務器的解決方案嗎? (每個線程都有上傳Ftp服務器上的目錄的工作)。

回答

1

你能解釋一下當你說它有點「凌亂」時你的意思嗎?任何特定症狀?

無論如何,從一張乾淨的紙張看這個我會說你想扼殺一次同時上傳的併發上傳數量,否則你可能會在連接數量方面遇到某種限制FTP服務器將允許單個客戶端或客戶端操作系統允許的連接數量。您的應用程序可能受限於帶寬而不是CPU,因此運行太多的線程可能會適得其反。您將基本上一次上傳更多項目,但吞吐量較低。

我認爲你的應用程序有一組cron4j關閉的任務,然後這些任務將一個目錄通過FTP上傳,這聽起來是對的嗎?

如果是這樣,我建議將它分成幾個階段,首先cron4j啓動構建可運行對象的任務,該對象在執行時將執行FTP上載而不是執行上載本身的任務。把這個runnable放在一個隊列中(來自java.util.concurrent的阻塞隊列是個好主意)。然後,您可以在線程池中運行另一個任務的實例,這些任務將從隊列中取出作業並執行它們(嘗試使用池中的線程數來查看哪些內容可以提供良好的吞吐量)。這將爲您提供一組競爭消費者,您可以限制併發上傳的有效數量(例如,每次4個)。


正如在評論中指出的那樣,SEDA模式聽起來很有趣。如果你打算在Java中進行任何併發編程,我建議你得到Doug Lea的「Java併發編程:設計原則和模式」的副本,它不包含Java 5的東西,但大部分是基於什麼無論如何,在書中。他清楚地解釋了關於線程安全以及如何編寫好的Java代碼的很多問題。

+0

Ben的方法聽起來很有效,它很好地利用了SEDA模式(Staged Event-Driven Architecture)。 – 2008-12-18 07:01:20

0

ipworks FTP類是線程安全的。你必須閱讀 Java併發在Brian Goetz撰寫實踐...

public class ServerConnection extends Thread { 

// the connection to the ftp server 
private final Ftp connection; 

,或者你可以實現Runnable並使用executorService,如果你不喜歡自己管理線程......