2017-03-04 1 views
0

Im Spring-Batch können Daten zwischen verschiedenen Schritten über ExecutionContext übergeben werden. Sie können die Details in einem Schritt festlegen und im nächsten Schritt abrufen. Haben wir etwas von dieser Art in der Frühjahrsintegration?Wie Informationen zwischen Federintegrationskomponenten übertragen werden?

Mein Anwendungsfall ist, dass ich eine Datei von FTP-Speicherort abholen, dann basierend auf bestimmten Geschäftslogik teilen und sie dann verarbeiten muss. Abhängig von den Dateinamen wird die Client-ID abgeleitet. Diese Client-ID würde in den Komponenten Splitter, Service-Aktivator und Aggregator verwendet werden.

Von meinem Anfänger Know-how habe ich im Frühjahr, konnte ich nichts finden, die mir helfen, Staat für einen bestimmten Lauf zu teilen.Ich wollte wissen, ob Spring-Integration bietet diese State-Sharing-Kontext in irgendeiner Weise.

Bitte lassen Sie mich wissen, wenn es eine Möglichkeit gibt, im Frühling-Kontext zu tun.

Antwort

1

Typischerweise vermitteln Sie Informationen zwischen den Komponenten in der Payload der Message selbst oder häufig über Nachrichten-Header - siehe Message Construction und Header Enricher

0

Im Frühjahr Integration-Anwendungen gibt es für staatlichen Sharing keine einzelnen ExecutionContext ist. Stattdessen, wie Gary Russel erwähnt hat, trägt jede Nachricht alle Informationen innerhalb ihrer Nutzlast oder ihrer Header.

Wenn Sie Spring Integration Java DSL verwenden und die clientId per Nachrichtenkopf übertragen möchten, können Sie enrichHeader Transformer verwenden. Wenn es mit einer HeaderEnricherSpec geliefert wird, kann es eine Funktion akzeptieren, die dynamisch bestimmten Wert für den angegebenen Header zurückgibt. Ab Ihren Anwendungsfall könnte dies wie folgt aussehen:

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

, wo deriveClientId Methode eine Art sein könnte:

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 Header von FTP-Nachrichtenquelle vorgesehen ist)

Wenn Sie auf die Kopfzeile clientId irgendwo im Downstream-Flow zugreifen müssen, können Sie es genauso wie den oben genannten Dateinamen tun:

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

Aber stellen Sie sicher, dass die message immer noch solche Header enthält, wie es irgendwo zwischen den Zwischenabläufen verloren gegangen sein könnte. Dies kann passieren, wenn Sie eine Nachricht irgendwann manuell erstellen und weiterleiten. Um alle Header zu verlieren nicht aus der vorhergehenden Nachricht, die Sie sie beim Bau kopieren:

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

Bitte beachten Sie, dass Nachrichten-Header im Frühjahr Integration unveränderlich ist. Es bedeutet, dass Sie nicht einfach eine Kopfzeile der vorhandenen Nachricht hinzufügen oder ändern können. Sie sollten eine neue Nachricht erstellen oder HeaderEnricher für diesen Zweck verwenden. Beispiele für beide Ansätze sind oben dargestellt.

Verwandte Themen