2015-12-03 16 views
1

我們需要使用同時運行的多個駱駝接口實例寫入單個文件。 該文件位於使用SMB安裝在JBoss服務器上的Windows共享文件系統上。使用駱駝文件組件在同一個掛載的文件夾上執行多個實例

我們使用camel文件組件來將每個實例的文件寫入本地文件。 下面是駱駝背景下端點URI

file:/fuse/server/location/proc?fileName=abc.csv&fileExist=Append 

文件生成具有當寫入從單個實例中發生任何問題,但在多個實例的情況下,隨意行垃圾字符添加到文件中。

我們正在使用JBoss的6.0.0保險絲和接口已經使用駱駝2.10版本編寫。

這怎麼解決?這是SMB安裝或接口需要處理它的問題。

+0

如果多個生產者寫入同一個文件,那麼我可以看到垃圾被添加,因爲它們覆蓋了其他人的訪問權限。一個文件不是一個可以被許多生產者一次寫入的對象,這就是爲什麼,例如,如果你在Excel中打開一個CSV文件,然後在記事本中,並試圖保存記事本版本,它會抱怨說文件被鎖定。您需要序列化對文件的訪問。該文件無法處理寫入該文件的兩個生產者,而沒有對首先寫入的人進行某種形式的控制等。認爲文件鎖定。 – Namphibian

+0

我假設駱駝文件組件會照顧它。這是否意味着我必須手動處理相同的問題。 – Yoogi

+0

這真的取決於文件系統。 Java可能在開源文件系統上效果更好,因爲他們的工程師可以創建特定於該文件系統的字節碼,他們畢竟可以讀取源碼。由於中小企業MS被法院強制開放協議,因此中小企業股票很好,但仍存在很多灰色地帶。我的建議是,而不是這些生產者發送數據到一個文件,使他們發送到一個排隊組件,如seda,並讓消息一個接一個地排隊,讓seda處理消息,因爲它將是一個先進先出隊列。無需手動完成。 – Namphibian

回答

0

我看了一下相關駱駝組件的源代碼(https://github.com/apache/camel/tree/master/camel-core/src/main/java/org/apache/camel/component/file)&沒有任何內置的支持從多個JVM中併發訪問單個文件。雖然可以處理來自單個JVM的並行訪問。

我認爲你有兩個基本的選項,以滿足您的要求:

  1. 編寫一些代碼來支持單個文件共享訪問。駱駝文件組件看起來像是在擴展的基礎上構建的,或者您可以創建一個獨立的組件來執行此操作。
  2. 作爲@Namphibian建議使用一些排隊系統,以連載的寫操作(雖然我不認爲會SEDA的工作,因爲它不跨越JVMS。

我的解決辦法是使用ActiveMQ的。每個實例應用程序將發送消息到一個單獨的共享隊列,然後一些其他進程將消耗MQ &中的消息寫入磁盤

由於消耗所有MQ消息的單個進程不會併發寫入文件系統。

更強大的解決方案wo用於在羣集中運行ActiveMQ(可能在每個應用程序實例中都有一個節點)。查看「JMSXGroupID」以防止消息的同時消耗。

+0

我同意保羅的意見。最好的做法是在前面添加一個消息傳遞系統,然後讓另一個camelcontext接收消息並寫入文件。 –