2013-07-07 6 views
5

मेरे पास एक ट्रांसफॉर्मर है जो परिणामस्वरूप मानचित्र लौटाता है। इसके परिणामस्वरूप आउटपुट-चैनल पर डाल दिया जाता है। मैं क्या करना चाहता हूं मानचित्र में प्रत्येक कुंजी के लिए अलग-अलग चैनल पर जाना है। मैं वसंत एकीकरण में इसे कैसे कॉन्फ़िगर कर सकता हूं?विभिन्न चैनलों के लिए वसंत एकीकरण स्प्लिटर मानचित्र कुंजी

उदा

ट्रांसफार्मर - पैदा करता है -> मानचित्र

मानचित्र {(कुंजी 1, "कुछ डेटा"), (Key2, "कुछ डेटा")}

तो कुंजी 1 के लिए होता है -> चैनल पर जाएं 1 तो कुंजी 2 के लिए -> चैनल 2 आदि पर जाएं ..

कोड उदाहरण उपयोगी होंगे।

अग्रिम धन्यवाद जीएम

उत्तर

1

आपका प्रसंस्करण दो चरणों से मिलकर चाहिए: अलग अलग हिस्सों कि स्वतंत्र रूप से कार्रवाई की जाएगी में

  1. विभाजन संदेश,
  2. रूटिंग अलग संदेशों (विभाजन के परिणाम) उपयुक्त चैनलों में।

पहले कार्य के लिए आपको स्प्लिटर का उपयोग करना होगा और दूसरे के लिए - राउटर (हेडर वैल्यू राउटर यहां सबसे अच्छा फिट बैठता है)।

कृपया नीचे नमूना वसंत एकीकरण कॉन्फ़िगरेशन पाएं। संदेशों को गठबंधन करने के लिए आप एक श्रृंखला के अंत में एक एग्रीगेटर का उपयोग करना चाह सकते हैं - मैं इसे अपने विवेकानुसार छोड़ देता हूं।

<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" /> 

और विभाजक:

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

हाय Piotrek, उत्तर के लिए धन्यवाद मैं इस बाहर की कोशिश करेंगे। – user2279337

+0

आपका स्वागत है;) मुझे उस दृष्टिकोण के बारे में किसी भी मुद्दे के मामले में बताएं - मैं इसे सीधे ओवरफ्लो ढेर करने के लिए लिख रहा था, इसलिए मुझे कुछ याद आ सकता था। –

संबंधित मुद्दे