2015-09-03 5 views
5

में एक गतिशील यूआरआई का उपयोग कैसे करें के रूप में Apache Camel में उल्लेख किया है, यह करने के लिए में गतिशील यूआरआई (लिखने के लिए) यह से में गतिशील यूआरआई लिखने के लिए अनुमति नहीं देता है की अनुमति देता है,()। क्योंकि मुझे कॉन्फ़िगरेशन के आधार पर फ़ाइलों को डाउनलोड करने के लिए कई एफ़टीपी स्थानों को कॉल करने की आवश्यकता है जिसे मैं डेटाबेस में संग्रहीत करने जा रहा हूं।से()

(FTPHost, FTPUser, FTPPassword, FTPSourceDir, FTPDestDir) 

मैं इन कॉन्फ़िगरेशन को डीबी से पढ़ूंगा और इसे रनटाइम पर गतिशील रूप से ऊंट मार्ग पर भेज दूंगा।

उदाहरण: यह ऊंट मार्ग उदाहरण है कि मैं गतिशील

<Route> 
    <from uri="ftp://${ftpUser}@${ftpHost}:${ftpPort}/${FTPSourceDir}?password=${ftpPassword}&delete=true"/> 
    <to uri="${ftpDestinationDir}"/> 
</Route> 

लिखने के लिए आपको उदाहरण में देख के रूप में है, मैं इन उल्लेख मापदंडों गतिशील पारित करने के लिए की जरूरत है। तो कैसे, में से()

उत्तर

5

आप इसे संपत्ति फ़ाइल से पढ़ सकते हैं इस प्रकार गतिशील uri उपयोग करने के लिए

<bean id="bridgePropertyPlaceholder" class="org.apache.camel.spring.spi.BridgePropertyPlaceholderConfigurer"> 
    <property name="location" value="classpath:/config/Test.properties"/> 
    </bean> 

<Route> 
    <from uri="ftp://{{ftpUser})@${{ftpHost}}:{{ftpPort}}/${{FTPSourceDir}}?password={{ftpPassword}}&delete=true"/> 
    <to uri="{{ftpDestinationDir}}"/> 
</Route> 

ftpUser, ftpHost .... - सभी कुंजियों Test.properties

में घोषित कर रहे हैं

यदि आप गतिशील रूप से अपने एक्सचेंज से उन चरों को प्राप्त करना चाहते हैं, तो आप इसे अपने उदाहरण में वर्णित नियमित तरीके से नहीं कर सकते हैं। आपको उपभोक्ता टेम्पलेट का उपयोग निम्नानुसार करना है,

Exchange exchange = consumerTemplate.receive("ftp:"+url); 
producerTemplate.send("direct:uploadFileFTP",exchange); 

आपको वसंत बीन या ऊंट निर्माता से ऐसा करना है। उपभोक्ता टेम्पलेट दिए गए घटक से उपभोग करेगा, और निर्माता टेम्पलेट आपके ऊंट-संदर्भ.एक्सएमएल

नोट में घोषित प्रत्यक्ष घटक का आह्वान करेगा नोट: उपभोक्ता और निर्माता टेम्पलेट थोड़ा महंगा हैं। आप दोनों वसंत कंटेनर में इंजेक्ट कर सकते हैं और वसंत को जीवन चक्र को संभालने दें।

+0

कहते हैं कि मैं 3 एफ़टीपी सर्वर है की सुविधा देता है, मैं कैसे एक मार्ग के लिए एक के बाद प्रत्येक सर्वर एक पारित कर सकते हैं? – hipokito

0

मुझे लगता है कि आप ऊंट मार्ग के भीतर अपनी आवश्यकता को लागू कर सकते हैं।

चूंकि आप अनेक FTP साइटों आप किसी भी तरह से इस प्रक्रिया को गति प्रदान करना होगा मतदान करना चाहते हैं। शायद आप इसे Quartz2 टाइमर के आधार पर कर सकते हैं। एक बार ट्रिगर होने पर आप कॉन्फ़िगर की गई FTP साइट from your database पढ़ सकते हैं।

दिए गए एफ़टीपी साइटों को मतदान करने के लिए आप Content Enricher pattern को मतदान के लिए (देखें: pollEnrich) गतिशील रूप से मूल्यांकन किए गए यूआरआई का उपयोग कर सकते हैं।

आपकी अंतिम बुनियादी मार्ग इस (स्यूडोकोड) की तरह कुछ लग सकता है:

from("quarz...") 
to("sql...") 
pollEnrich("ftp...") 
... 
1

मैं एक टीम है जो प्रतिदिन एक लाख संदेश के बारे में स्विचिंग संदेश दलाल संचालित मदद करते हैं। 50 से अधिक गंतव्यों हैं जिनसे हमें सभी फाइल शेयरिंग ब्रांडों (एफ़टीपी, एसएफटीपी, एनएफएस/फाइल: ...) पर फाइलों को मतदान करना होगा। 50 तैनाती को बनाए रखने के लिए जो प्रत्येक एक अलग स्थानीय/दूरस्थ निर्देशिका को सुनता है, वास्तव में एक ही फाइल कनेक्टर की तुलना में एक ओवरहेड है जो 50 स्थानों पर फाइलों को मतदान के लिए सक्षम करता है, प्रत्येक के विशिष्ट शेड्यूल और सुरक्षा सेटिंग्स के अनुसार ... समान कहानी प्राप्त करने के लिए पॉप 3 और आईएमएपी मेलबॉक्स से ई-मेल।

कैमल में, एक समाधान की रूपरेखा इस प्रकार है:

  • आप कोई विकल्प नहीं है लेकिन एक यूआरआई के साथ() अपने मार्गों में से भाग से कम से कम कॉन्फ़िगर करने के लिए java DSL का उपयोग करें कि आप कर सकते हैं वास्तव में किसी डेटाबेस से पढ़ें/बनाएं या एक नया अनुरोध शुरू करने के लिए व्यवस्थापक अनुरोध से प्राप्त करें। एक्सएमएल डीएसएल केवल injecting properties की अनुमति देता है जिसे ऊंट का संदर्भ बनाया गया है और कभी भी बाद में हल नहीं किया जाता है।
  • मूल विचार, मार्गों शुरू करने के लिए, उन्हें चलाने (सुनने या एक सटीक संसाधन पोल) करते हैं, और उसके बाद बंद & कैमल संदर्भ API का उपयोग करके RouteDefinitions के राज्य का प्रबंधन करने की मांग पर उन्हें फिर से बनाना मार्गों है , और संभवतः एंडपॉइंट्स
  • व्यक्तिगत रूप से, मैं मार्ग के 'से' भाग के साथ न्यूनतम मार्गों पर (जैसे) from(uri).to("direct:inboundQueue").routeId("myRoute"), और फिर परिभाषित करता हूं - जावा या एक्सएमएल में - एक सामान्य मार्ग खंड शेष प्रक्रिया को संभालती है: from("direct:inboundQueue").process(..).etc... .to(outUri)
  • मैं दृढ़ता से सलाह दूंगा स्प्रिंग ढांचे साथ कैमल गठबंधन करने के लिए, और विशेष रूप से Spring MVC (या स्प्रिंग एकता HttpGateway) ताकि आप शीघ्रता से बाकी, साबुन, HTTP/JSP, या JMX सेम इंटरफ़ेस बनाने के मार्ग निर्माण के लिए प्रशासन की क्षमता मज़ा आएगा, विनाश , और स्प्रिंग + ऊंट कंटेनर के भीतर अपडेट, nicely integrated दोनों।
  • तब आप के साथ ऊंट मार्गों का निर्माण करते समय सामान्य रूप से SpringRouteBuilder को विस्तारित करते हुए वसंत अनुप्रयोग संदर्भ में एक बीन घोषित कर सकते हैं; अनिवार्य @Override configure() विधि लागू करने में, आप अपने routeDefinition वस्तु from(uri) विधि द्वारा बनाया बचाने के लिए, और यह एक ज्ञात Stringमार्ग-आईडी आवंटित .routeId(route-id) विधि के साथ होगा; उदाहरण के लिए आप रूट-आईडी का उपयोग अपनी रूट परिभाषा ऑब्जेक्ट्स के मानचित्र में एक कुंजी के रूप में कर सकते हैं जो पहले से ही बनाया और शुरू किया गया है, साथ ही यूआरआई के आपके डीबी में एक कुंजी भी है।
  • तो आप SpringRouteBuilder सेम आप नए तरीकों के साथ घोषणा की है विस्तार createRoute (मार्ग-इड), updateRoute (मार्ग-इड), और removeRoute (मार्ग-इड); बनाने या अद्यतन के लिए आवश्यक संबंधित रूट-आईडी पैरामीटर डेटाबेस या किसी अन्य रजिस्ट्री से प्राप्त किए जाएंगे, और रूटबिल्डर बीन के भीतर चल रहे प्रासंगिक विधि, getContext() सुविधा से वर्तमान ModelCamelContext पुनर्प्राप्त करने के लिए लाभ उठाएंगे, जिसका बदले में उपयोग किया जाता है stopRoute(route-id), removeRoute(route-id), और फिर addRouteDefinition( यहाँ को जाता है, जहां आप routeDefinition वस्तु), और अंत में startRoute(route-id) की जरूरत है:
  • अपने प्रशासनिक इंटरफ़ेस (नोट संभव भूत Endpoints जिन्हें निकाला नहीं किया जाएगा, के रूप में removeRoute() javadoc में विस्तार से बताया सावधान रहना) (जो आमतौर पर एक स्प्रिंग @ कंट्रोलर घटक/बीन का रूप लेता है जो HTTP/REST/SOAP ट्रैफ़िक को संभालता है) वास्तव में पाने के लिए एक आसान काम होगा पहले बनाया गया SpringRouteBuilder एक्सटेंशन बीन इंजेक्शन द्वारा कंट्रोलर बीन में इंजेक्शन किया गया था, और इस प्रकार सभी आवश्यक createRoute(route-id), updateRoute(route-id), और removeRoute(route-id) विधियों को एक्सेस किया गया है जिन्हें आपने SpringRouteBuilder एक्सटेंशन बीन में जोड़ा है।

और यह अच्छी तरह से काम करता है। लागू होने वाले सभी त्रुटि हैंडलिंग और सत्यापन कोड के साथ सटीक कार्यान्वयन यहां पोस्ट करने के लिए थोड़ा अधिक कोड है, लेकिन आपके ऊपर उपरोक्त में "कैसे करें" प्रासंगिक के सभी लिंक हैं।

4

ऊंट 2.16 से, हम, फ़ाइल की तरह मतदान उपभोक्ता को परिभाषित करने के pollenrich घटक का उपयोग कर सकते गतिशील यूआरएल के साथ ftp..etc-वार्डों पर/

नीचे
<route> 
    <from uri="direct:start"/> 
    <pollEnrich> 
    <simple>file:inbox?fileName=${body.fileName}</simple> 
    </pollEnrich> 
    <to uri="direct:result"/> 
</route> 

इसके awesomeeee तरह पैरामीटर मान !!!

देखें: http://camel.apache.org/content-enricher.html

0
Use Camel endpoint with spring spel expression. 

Set up a Camel endpoint in the context so it can be accessed from any bean: 

     <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring"> 
      <endpoint id="inventoryQueue" uri="#{config.jms.inventoryQueueFromUri}"/> 
     </camelContext> 

Now you can reference the inventoryQueue endpoint within the `@Consume` annotation as follows: 
     @org.apache.camel.Consume(ref = "inventoryQueue") 
     public void updateInventory(Inventory inventory) { 
      // update 
     } 

    Or: 
    <route> 
     <from ref="inventoryQueue"/> 
     <to uri="jms:incomingOrders"/> 
    </route> 
संबंधित मुद्दे