2011-11-15 48 views
1

我們有一個應用程序從特定文件夾讀取文件,處理它們並將其複製(某些業務邏輯)到另一個文件夾。從文件系統讀取文件時的併發性

這裏的問題是,當有大量的文件需要處理時,運行一個應用程序的單個實例或單個線程不再足以處理這些文件。

我們的一個方法是啓動應用程序的多個實例(我覺得這種方法有問題,建議我有一個替代方案)。

產生線程或啓動應用程序的多個實例時,應該注意,如果線程讀取一個文件並開始處理它,另一個線程就不應該選取它。

我們正試圖通過其與文件夾在文件名列表中選擇一個數據庫表來實現這一,這樣,當一個線程首先讀取的文件名的表,我們將狀態在改變- 進程完成並悲觀鎖定表,以便其他線程無法讀取它。

有沒有更好的解決方案?

+1

您需要確保磁盤子系統不是您的瓶頸。運行多個進程或線程將有助於CPU或外部服務,例如數據庫是你的瓶頸。 –

回答

1

您可以將大部分現有實現用作前端處理器,將文件流提供給工作線程,您可以根據需求開始/停止工作線程。只有前端線程打開文件,所以有沒有一個工人干擾另一個工人的可能性。

編輯:添加詞「不」,因爲它改變了含義頗有幾分...

0

也看看JDK 7,它有一個新的文件I/O API和叉/加入框架可能會有所幫助。

0

查看Apache Camel(http://camel.apache.org)及其文件組件(http://camel.apache.org/file2.html)。使用Camel可以非常方便地定義一組處理指令,以原子方式使用目錄中的文件,還可以配置線程池以同時處理多個文件。駱駝在行動是一本好書,讓你開始。

0

您描述的內容讓我想起了在UNIX上開發的古典風格。

在這種古典風格中,您將文件移動到正在進行工作的目錄中,以便其他文件不會將其提取出來。一般來說:您可以在每個處理狀態下使用一個目錄,並且可以將文件從狀態移動到狀態。

這個工作基本上是因爲file moves are atomic(至少在Unix系統和NFTS下)。

這種方法的好處在於處理有問題的情況(如崩潰)非常簡單,它自動具有人人熟悉的良好管理界面(文件系統GUI,ls,Windows資源管理器...)。