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:inbound-channel-adapter は、sftp サーバーからファイルをダウンロードするために使用されます。約6ファイルをダウンロードします。すべての xml ファイル。

Transformer は 6 つのファイルすべてを反復処理し、エラー タグがあるかどうかを確認します。エラータグがある場合、エラーコードは 1 に設定されます。それ以外の場合は 0 に設定されます。

変圧器を出てルーターに向かう際、エラーコードが1のファイルは特定のフォルダに移動(Error)、エラーコードが0のファイルは別のフォルダに移動(NoError)したい.

現在、トランスフォーマーは、6 つのファイルすべてのエラーコードとファイル名を含む「 list fileNames 」を返します。

ルーターを使用して各ファイルのエラー コードを確認するにはどうすればよいですか? 次に、その特定のファイルをルーターにマップします。

私の問題の一般的な C ロジック

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

春の統合を使用してこれを達成するにはどうすればよいですか?. 不可能な場合、回避策はありますか? 私は今それが明確であることを願っています。前回は十分な詳細を提供できなかったことをお詫び申し上げます。

また、int-sftp:inbound-channel-adapter で、「remote-directory」フィールドと「local-directory」フィールドをシステム内の特定のフォルダーにハードコーディングしました。Bean プロパティまたは定数値からこれらを参照できますか? config.xml ファイルに基づいてこれらの値を構成する必要がありますが、それは可能ですか?

Spring Integration は初めてです。私を助けてください。前もって感謝します。

4

1 に答える 1

0

「トランスフォーマーは6つのファイルすべてを反復する」とはどういう意味かはまだわかりません。

各ファイルは 1 つのメッセージでトランスフォーマーに渡されるため、6 つのリストを出力する方法がわかりません。

<aggregator/> とcorrelation-strategy-expression="'foo'"が必要なようですrelease-strategy-expression="size() == 6"。これにより、各シングルFileがリストに集約さFileれ、トランスフォーマーに渡されます。次に、ファイル名とエラー コードを含むステータス オブジェクトのリストに変換します。

最後に、<splitter/>リストを個別の FileName メッセージに分割してルーターに送信する を追加します。

ディレクトリ属性に通常の Spring プロパティ プレースホルダー${some.property}を使用するか、SpEL を使用して別の Bean のプロパティを使用できます#{someBean.remoteDir}

于 2013-07-31T15:17:44.663 に答える