2013-07-31 90 views
0

我使用彈簧集成來下載文件並對其進行處理。通過彈簧集成來遍歷文件或記錄列表

<int-sftp:inbound-channel-adapter channel="FileDownloadChannel" 
         session-factory="SftpSessionFactory" 
         remote-directory="/home/sshaji/from_disney/files" 
         filter = "modifiedFileListFilter" 
         local-directory="/home/sshaji/to_disney/downloads" 
         auto-create-local-directory="true" >      
     <integration:poller cron="*/10 * * * * *" default="true"/> 
</int-sftp:inbound-channel-adapter> 

<integration:transformer input-channel="FileDownloadChannel" 
          ref="ErrorTransformer" 
          output-channel="EndChannel"/> 

    <integration:router input-channel="FileErrorProcessingChannel" 
         expression="payload.getErrorCode() > 0"> 
     <integration:mapping value="true" channel="ReportErrorChannel"/> 
     <integration:mapping value="false" channel="FilesBackupChannel"/> 
    </integration:router> 

int-sftp:入站通道適配器用於從sftp服務器下載文件。 它下載約6個文件。所有的xml文件。

轉換器遍歷所有6個文件並檢查它們是否有錯誤標記。 如果有錯誤標籤,那麼它將設置它的錯誤代碼爲1.否則它將被設置爲0.

當它從變壓器出來並進入路由器時,我想發送錯誤代碼的文件被設置爲1以移動到特定文件夾(錯誤) 以及錯誤代碼設置爲0以移動到另一文件夾(NoError)的那些文件夾。

目前變壓器返回一個「list fileNames」,其中包含所有6個文件的錯誤代碼和文件名。

如何檢查每個使用路由器的文件的錯誤代碼?然後將該特定文件映射到路由器。

常見的C邏輯我的問題

for (int i =0; i<fileNames.lenght();i++) { 
    if(fileNames[i].getErrorCode == 1) { 
    moveToErrorFolder(fileNames[i].getName()); 
    } else { 
    moveToNoErrors(fileNames[i].getName()); 
    } 
} 

我怎樣才能做到這一點使用Spring的集成? 如果它不可能,是否有任何解決方法? 我希望現在清楚。我很抱歉上次沒有提供足夠的細節。

同樣在int-sftp:入站通道適配器中,我已經將「remote-directory」和「local-directory」字段硬編碼到系統中的特定文件夾。我可以從一個bean屬性或從一個常量值引用這些嗎? 我需要根據config.xml文件配置這些值,這是可能的嗎?

我是Spring Integration的新手。請幫幫我。 在此先感謝。

+0

對不起,我不明白你在問什麼。請提供更多詳細信息,以及路由器之前的SI配置。 –

+0

感謝@GaryRussell的回覆,我更新了更多的細節。請看一看。請問我是否需要更多的細節。我很感激幫助。 –

回答

0

目前還不清楚你的意思是「變壓器重複所有6個文件」。

每個文件將被傳遞給單個消息的變壓器,所以我看不出它如何能發出的6

列表這聽起來像你需要一個<aggregator/>與correlation-strategy-expression="'foo'"release-strategy-expression="size() == 6"。這會將每個單個File彙總到一個File的列表中,並將其傳遞給您的變壓器。然後它將它轉換爲包含文件名和錯誤代碼的狀態對象列表。

最後,您將添加一個<splitter/>,它將列表分割成單獨的FileName消息發送到路由器。

對於目錄屬性${some.property}或SpEL,可以使用普通的Spring屬性佔位符來使用另一個bean的屬性#{someBean.remoteDir}

+0

好的,我怎麼能結合分配器和路由器爲此目的。分離器輸出將是一個大小爲6的狀態對象列表。路由器如何處理每個單獨的文件並將它們映射到單獨的通道。我只看到路由器將整個有效載荷映射到兩個不同的通道。我還沒有看到基於有效負載中各個內容的路由器映射。我是新來的。請舉個例子。這將有很大的幫助。 –

+0

也可以請你建議一個解決方案int-sftp:入站通道適配器,我已經硬編碼「遠程目錄」和「本地目錄」字段到系統中的特定文件夾。我可以從一個bean屬性或從一個常量值引用這些嗎?我需要根據config.xml文件配置這些值,這是可能的嗎? –

+0

你不能 - 這就是爲什麼你需要一個分離器。我還更新了答案,以展示如何設置這些屬性。請注意,它們僅初始化一次。 –