2017-02-16 28 views
2

我最近開始使用Camel將某些文件ftp到遠程服務器。有相當多的數據需要傳輸(〜5 GB)。爲了快速傳遞這些數據,我設置了Camel來處理幾個線程。 我的配置類看起來如下:駱駝拉鍊輸入Apache Camel無法在xxx毫秒內獲取鎖定。將跳過文件

@Component 
public class FTPCamelRoute extends SpringRouteBuilder { 

    @Value("${camel.zip.input}") 
    private String inputDirectory; 

    public void configure() { 
     from(inputDirectory + "?recursive=true&readLock=changed&readLockTimeout=3000&readLockCheckInterval=500&readLockMinAge=30s") 
      .onException(Exception.class).maximumRedeliveries(3).retryAttemptedLogLevel(LoggingLevel.WARN).continued(true).end() 
      .threads(10) 
      .log("Uploading file ${file:name}") 
      .to("{{camel.zip.output}}") 
      .log("Uploaded file ${file:name} complete."); 
    } 
} 

定義和輸出文件夾如下所示:

camel.zip.input=file\\:/Temp/ 
camel.zip.output=ftp://host:21?username=xxx&password=yyy&binary=true 

當運行我的代碼,所有的文件傳輸。但是,我反覆不斷地在多個文件上得到一個readLock超時(我說約需要處理的文件的10%,拋出這個超時)。我假設一些線程試圖鎖定已被另一個線程處理的文件,因此該文件的readLock超時。但是,對於線程應用程序來說,這似乎不太合適。有沒有辦法解決這個問題?

Thnx提前

+0

我之前沒有使用'apache-camel',但是可能會在兩者之間使用某種阻塞隊列,以便線程可以使隊列中的文件名排列。這將確保一個線程只能處理一個文件。 – CKing

+0

這可能是這個問題的一個可能的解決方案。我們選擇了駱駝,因爲它非常靈活,有很多配置選項,並且非常易於使用。 我對自己的排隊並不熟悉,但如果項目仍處於啓動階段,我肯定會考慮它。 –

回答

0

你不應該自己產生線程。除非另有說明,否則駱駝將讀取您的目錄中的所有文件,並且無論如何都會在單獨的線程中處理每個文件。您的讀取鎖定可能是由於部分或全部其他線程嘗試訪問已被第一個線程鎖定的文件。

+0

是的,這就是我的想法。看起來這更像是Apache-camel本身的一個bug,而不是其他任何東西。 我只是想知道是否有任何方法可以輕鬆過去,也許通過更改一些駱駝配置選項?我嘗試了一下鎖定策略,但他們似乎都沒有解決這個問題。 –

+0

我的意思是文件組件及其衍生物(例如ftp或sftp)本身是多線程的。因此,不應該真的需要你使用DSL。你所得到的讀取鎖定是在你自己的線程之前發生的,這表明你正在不斷地將文件寫入你正在輪詢的目錄,對嗎?如果路由無法實現排它鎖定,則文件將被跳過。爲避免這種情況,您應該將文件寫入臨時目錄,然後將它們移到您之後用作從端點的目錄。 – noMad17

+0

啊哈! 你說得對。我的春天批處理正在生成文件並將它們寫入目錄。我的駱駝處理使用這個相同的目錄作爲終點。 出於這個確切原因,我使用了「更改過的」readlock,其中readLockMinAge爲30秒。我的春天批處理應該不需要比寫文件到那個目錄更長的時間,但是也許我忽略了那裏的一些東西。 然而,將「線程(10)」添加到整個駱駝處理過程中會顯着加速ftp(我的測試運行花費了大約1/3的時間,而不需要線程)。 –

相關問題