2017-03-04 5 views
0

バネバッチでは、ExecutionContext経由でさまざまなステップ間でデータを渡すことができます。詳細を1ステップで設定し、次のステップで取得できます。この種のものは春に統合されていますか?春の統合コンポーネント間で情報を渡すには?

私の使用例は、ftpの場所からファイルを取り出し、特定のビジネスロジックに基づいてファイルを分割して処理する必要があるということです。ファイル名に応じて、クライアントIDが導出されます。このクライアントIDは、スプリッタ、サービスアクティベータ、アグリゲータコンポーネントで使用されます。

私が春に持っていた初心者のレベルから、私は特定のランの状態を分かち合うのに役立つものは見つけられませんでした。私は、春の統合が何らかの形でこの状態共有の文脈を提供するかどうかを知りたかったのです。

春の文脈で行う方法がある場合は教えてください。

答えて

1

は、通常は、メッセージヘッダーを介してメッセージペイロード自体、あるいはしばしば内のコンポーネント間で情報を伝える - 状態を共有するための単一のExecutionContextがないスプリング統合アプリケーションでMessage Construction

0

Header Enricherを参照します。代わりに、Gary Russelが述べたように、各メッセージはそのペイロードまたはヘッダー内のすべての情報を運びます。

Spring Integration Java DSLを使用していて、clientIdをメッセージヘッダーで転送する場合は、enrichHeaderトランスを使用できます。 HeaderEnricherSpecが提供されているので、指定されたヘッダーに対して動的に決定された値を返す関数を受け入れることができます。

private String deriveClientId(Message<File> fileMessage) { 
    String fileName = fileMessage.getHeaders().get(FileHeaders.FILENAME, String.class); 
    String clientId = /*some other logic for deriving clientId from*/fileName; 
    return clientId; 
} 

FILENAMEヘッダーがFTPメッセージソースによって提供される)

deriveClientId方法は一種のかもしれない

return IntegrationFlows 
    .from(/*ftp source*/) 
    .enrichHeaders(e -> e.headerFunction("clientId", this::deriveClientId)) 
    ./*split, aggregate, etc the file according to clientId*/ 

、:あなたのユースケースのように、これは次のようになりますダウンストリームフローのどこかでclientIdヘッダーにアクセスする必要がある場合は、上記のファイル名と同じ方法で行うことができます。

String clientId = message.getHeaders().get("clientId", String.class); 

しかし、messageには、中間フロー項目のどこかで失われた可能性のあるヘッダーが含まれていることを確認してください。これは、ある時点で手動でメッセージを作成してさらに送信する場合に発生する可能性があります。

Message<PayloadType> newMessage = MessageBuilder 
     .withPayload(payloadValue) 
     .copyHeaders(precedingMessage.getHeaders()) 
     .build(); 

メッセージヘッダは春の統合で不変であることに注意してください:ためには、あなたが建物の中にそれらをコピーすることができ、先行するメッセージから任意のヘッダを失いません。既存のメッセージのヘッダーを追加または変更するだけでは意味がありません。新しいメッセージを作成するか、HeaderEnricherを使用してください。両方のアプローチの例を上に示します。

関連する問題