2017-03-04 86 views
0

在spring-batch中,可以通過ExecutionContext在各個步驟之間傳遞數據。您可以在一個步驟中設置細節,並在下一步中檢索。我們在春季融合中是否有這種類型的東西?如何在彈簧集成組件之間傳遞信息?

我的用例是我必須從ftp位置獲取文件,然後根據特定的業務邏輯對其進行拆分,然後對其進行處理。根據文件名將導出客戶端ID。此客戶端ID將用於分離器,服務激活器和聚合器組件。

從我在春季的新手級別的專業知識中,我找不到任何能夠幫助我分享特定運行狀態的內容。我想知道春季整合是否以某種方式提供了這種狀態共享上下文。

請讓我知道是否有辦法在春季背景下做。

回答

0

在Spring集成應用中存在的狀態共享沒有單一的ExecutionContext。相反,正如Gary Russel所述,每條消息都會在其有效載荷或其標題中攜帶所有信息。

如果您使用Spring Integration Java DSL並希望通過郵件頭來傳輸clientId,則可以使用enrichHeader變壓器。提供了一個HeaderEnricherSpec,它可以接受一個函數,它爲指定的頭返回動態確定的值。隨着你的使用情況,這可能是這樣的:

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

,其中deriveClientId方法可能是一個排序:

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消息源提供)

當您需要訪問下游流程中某處的clientId標頭時,您可以使用與上述文件名相同的方法:

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

但請確保message仍包含此類標頭,因爲它可能已在中間流項目中的某處丟失。如果您在某些時候手動構建消息並進一步發送消息,可能會發生這種情況。爲了不失去從前面的消息,你可以在建築過程中複製它們的任何標題:

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

請注意,消息頭和Spring集成不變。這意味着您不能只添加或更改現有消息的標題。您應該創建一條新消息或爲此目的使用HeaderEnricher。上面介紹了兩種方法的例子。