2013-07-07 4 views
5

Ho un trasformatore che restituisce una mappa come risultato. Questo risultato viene quindi inserito nel canale di uscita. Quello che voglio fare è andare su un canale diverso per ogni KEY nella mappa. Come posso configurarlo in Spring Integration?Spring Map Splitter di integrazione chiavi su diversi canali

ad es.

Transformer - produce -> Mappa

Map contiene {(Key1, "alcuni dati"), (Key2, "alcuni dati")}

Così per Key1 -> passare a un canale 1 Quindi per Key2 -> vai al canale 2 ecc.

Esempi di codice sarebbero utili.

Grazie in anticipo GM

risposta

1

vostro trattamento dovrebbe consistere in due fasi: un messaggio

  1. suddivisione in parti separate che verranno elaborati in modo indipendente,
  2. messaggi separati routing (il risultato della scissione) nei canali appropriati.

Per il primo compito è necessario utilizzare lo splitter e per il secondo un router (il router con valore di intestazione si adatta meglio qui).

Si prega di trovare una configurazione di integrazione Spring di seguito. Potresti voler utilizzare un aggregatore alla fine di una catena per combinare i messaggi - lo lascio a tua discrezione.

<channel id="inputChannel"> 

<!-- splitting message into separate parts --> 
<splitter id="messageSplitter" input-channel="inputChannel" method="split" 
       output-channel="routingChannel"> 
    <beans:bean class="com.stackoverflow.MapSplitter"/> 
</spliter> 

<channel id="routingChannel"> 

<!-- routing messages into appropriate channels basis on header value --> 

<header-value-router input-channel="routingChannel" header-name="routingHeader"> 
    <mapping value="someHeaderValue1" channel="someChannel1" /> 
    <mapping value="someHeaderValue2" channel="someChannel2" />  
</header-value-router> 

<channel id="someChannel1" /> 
<channel id="someChannel2" /> 

E il divisore:

public final class MapSplitter { 

    public static final String ROUTING_HEADER_NAME = "routingHeader"; 

    public List<Message<SomeData>> split(final Message<Map<Key, SomeData>> map) { 
    List<Message<SomeData>> result = new LinkedList<>(); 

    for(Entry<Key, SomeData> entry : map.entrySet()) { 
     final Message<SomeData> message = new MessageBuilder() 
      .withPayload(entry.getValue()) 
      .setHeader(ROUTING_HEADER_NAME, entry.getKey()) 
      .build(); 
     result.add(message); 
    } 

    return result; 
    } 
} 
+0

Hi Piotrek, Grazie per la risposta cercherò questo fuori. – user2279337

+0

Siete i benvenuti;) Fatemi sapere in caso di problemi relativi a tale approccio: stavo scrivendo direttamente per impilare l'overflow, in modo da poter perdere qualcosa. –