2012-09-25 17 views
6

के अंत में दोनों अनुरोध और उत्तर संदेश तक पहुंचें, मैं अपने मार्ग के अंत में अनुरोध और प्रतिक्रिया संदेश दोनों को संसाधित करना चाहता हूं। हालांकि, मुझे मूल अनुरोध संदेश तक पहुंचने का तरीका नहीं दिख रहा है।अपाचे कैमल: मार्ग

मुझे भयानक लग रहा है कि मैं कुछ बुनियादी अवधारणाओं के साथ संघर्ष कर रहा हूं।

यहाँ डीएसएल में एक साधारण उदाहरण के मार्ग मेरी समस्या की रूपरेखा तैयार करने (streamCaching पूरे संदर्भ के लिए सक्षम किया गया है) है:

from("activemq:queue:myQueue") 
.to("log:" + getClass().getName() + "?showOut=true") 
.to("http://localhost:8080/someBackend") 
.log("Now in.Body returns this: ${in.body} and out.Body this: ${out.body}") 
.to("log:" + getClass().getName() + "?showOut=true"); 

यहाँ (बेहतर पढ़ने के लिए संपादित लाइन टूट जाता है) मेरी लॉग से एक के अनुसार अंश है । जैसा कि कोई देख सकता है, http सर्वर उत्तर देने के बाद मूल SOAP संदेश खो जाता है, और एसओएपी प्रतिक्रिया ऑब्जेक्ट संदेश के बॉडी में संग्रहीत होता है।

2012-09-25 17:28:08,312 local.bar.foo.MyRouteBuilder INFO - 
    Exchange[ExchangePattern:InOut, BodyType:byte[], 
    Body:<?xml version="1.0" encoding="UTF-8"?><env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"><env:Header /><env:Body><urn:someRequest xmlns:urn="http://foo.bar.local/ns"></urn:someRequest></env:Body></env:Envelope>, 
    Out: null] 
2012-09-25 17:28:08,398 org.apache.camel.component.http.HttpProducer DEBUG - 
    Executing http POST method: http://localhost:8080/someBackend 
2012-09-25 17:28:09,389 org.apache.camel.component.http.HttpProducer DEBUG - 
    Http responseCode: 200 
2012-09-25 17:28:09,392 route2 INFO - 
    Now in.Body returns this: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:someResponse xmlns:ns2="http://foo.bar.local/ns"</ns2:someResponse></soap:Body></soap:Envelope> 
    and out.Body this: 
2012-09-25 17:28:09,392 local.bar.foo.MyRouteBuilder INFO - 
    Exchange[ExchangePattern:InOut, 
    BodyType:org.apache.camel.converter.stream.InputStreamCache, 
    Body:[Body is instance of org.apache.camel.StreamCache], 
    Out: null] 

मुझे उम्मीद है कि किसी और में शामिल होगा। किसी को पूरे रास्ते में संरक्षित किया जाएगा?

वैकल्पिक समाधान मैं विचार कर रहा हूँ: Correlation Identifier पैटर्न के

  • उपयोग करें दोनों अनुरोध और जबाब मेल खाते हैं। लेकिन क्या यह संदेश निकायों को भी संरक्षित करेगा? साथ ही, मेरे अनुरोध/उत्तर संदेशों में सहसंबंध के लिए अद्वितीय पहचानकर्ता नहीं हैं।
  • जो http बैकएंड करने के लिए कॉल करता है एक कस्टम सेम, लिखें, दोनों अनुरोध पर कार्रवाई करने और उत्तर वस्तुओं (लेकिन यह मूल रूप से एक नो-ऊंट समाधान है, पहिया और इसलिए पसंदीदा नहीं पुनर्रचना)

पहले से ही में विफल रहा है दृष्टिकोण:

मैं अपने मार्ग के अंत में इस तरह की एक प्रोसेसर का उपयोग कर मूल अनुरोध संदेश पहुँचने का प्रयास किया है, कोई सफलता के साथ:

process(new Processor() { 
    @Override 
    public void process(Exchange exchange) throws Exception { 
     Message originalInMessage = exchange.getUnitOfWork().getOriginalInMessage(); 
     logger.debug(originalInMessage.getBody(String.class)); 
     logger.debug(exchange.getIn().getBody(String.class)); 
    } 
}); 

किसी भी मदद

+1

मुझे इसी तरह की स्थिति का सामना करना पड़ा, जैसा हल किया गया: स्ट्रिंग पेलोड = नया स्ट्रिंग ((बाइट []) exchange.getUnitOfWork()। GetOriginalInMessage()। GetBody()) – dkb

उत्तर

14

बस एक शीर्ष लेख या एक संपत्ति में संदेश में के मूल शरीर की दुकान और अंत में इसे पुनः प्राप्त:

from("activemq:queue:myQueue") 
.setProperty("origInBody", body()) 
.to("http://localhost:8080/someBackend") 

बाद http://camel.apache.org/content-enricher.html

आपका मार्ग कुछ इस तरह होगा http कॉल तब आप संपत्ति origInBody तक पहुंच सकते हैं।

12

पहले के लिए धन्यवाद, इस लेख बहुत अच्छी तरह से पता चलता है कि अंदर और बाहर ऊंट में काम करता है: http://camel.apache.org/using-getin-or-getout-methods-on-exchange.html

आमतौर पर, बाहर संदेश हमेशा प्रयोग किया जाता है, बल्कि की नकल की प्रत्येक चरण में इन-संदेश से ।

अपने मामले में, जहां आप मूल संदेश को रूट के अंत तक रहने के लिए चाहते हैं, तो आप समृद्धि ईआईपी के साथ आगे बढ़ सकते हैं।

public class MyAggregationStrategy implements AggregationStrategy { 
    public Exchange aggregate(Exchange orig, Exchange httpExchange){ 
    // if you want to check something with the Http request, you better do that here 
    if(httpExchange is not correct in some way) 
     throw new RuntimeException("Something went wrong"); 

    return orig; 
    } 
} 

AggregationStrategy aggStrategy = new MyAggregationStrategy(); 

from("activemq:queue:myQueue") 
    .enrich("http://localhost:8080/someBackend",aggStrategy) 
    .//keep processing the original request here if you like, in the "in" message 
+0

इसके लिए बहुत धन्यवाद। मैंने "क्रिश्चियन श्नाइडर" द्वारा प्रदान किए गए समाधान का उपयोग किया क्योंकि यह मेरे उपयोग के मामले को हल करता है।हालांकि, अधिक जटिल परिदृश्यों के लिए मुझे लगता है कि एग्रीगेशनस्ट्रेटी जाने का रास्ता है। अक्सर पूछे जाने वाले प्रश्न प्रविष्टियों में लिंक के लिए बहुत धन्यवाद, यह मेरा ध्यान फिसल गया। (ऊपर नहीं जा सका क्योंकि मेरे पास पर्याप्त अंक नहीं हैं, इसके लिए खेद है) – user1627943

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