2015-04-22 11 views
22

मेरे पास ओएसजीआई कंटेनर में तैनात कई बंडल (ए, बी, और सी) हैं, जिनमें प्रत्येक CamelContext और कुछ मार्ग हैं। मेरे पास CamelContext के साथ एक मार्ग (निगरानी डेटा एकत्र करने के लिए) और InterceptStrategy बीन के साथ एक और बंडल (एम) है। मैं InterceptStrategy एम से बीन को अन्य बंडलों को संशोधित किए बिना कंटेनर (यानी ए, बी, और सी में) के सभी अन्य CamelContext एस पर स्वचालित रूप से लागू करना चाहता हूं।ओएसजीआई कंटेनर में ऊंट: सभी ऊंट संदर्भों के लिए InterceptStrategy लागू करें

आखिरकार, लक्ष्य को स्पष्ट रूप से रूट करने के लिए ए, बी, या सी में कोई भी बदलाव किए बिना एम में रूट में प्रत्येक CamelContext से डेटा को वायरटैप करना है। क्या यह दृष्टिकोण या एक समान दृष्टिकोण करने योग्य है?

CamelContext एस के सभी स्प्रिंग एक्सएमएल का उपयोग करके कॉन्फ़िगर किए गए हैं।


अद्यतन: अतिरिक्त संदर्भ

बंडल ए, बी, और सी डाटा प्रोसेसिंग के लिए जिम्मेदार मुख्य उत्पाद होते हैं। बंडल एम में एक वैकल्पिक निगरानी उपकरण है, जो ए, बी, और सी के माध्यम से बहने वाले डेटा के कुछ मानकों को मापने के लिए डिज़ाइन किया गया है। वर्तमान में, वैकल्पिक टूल को जोड़ने के लिए ए, बी, और सी में मार्गों को बदलने की आवश्यकता है ताकि अतिरिक्त Processor एस को समृद्ध किया जा सके। Exchange निगरानी डेटा के साथ और <to /> एंडपॉइंट्स से पहले निगरानी डेटा पढ़ने के लिए।

लक्ष्य बंडल एम में ए, बी, और सी के साथ पहले से ही सत्यापित-कार्यरत प्रणाली में ड्रॉप करने में सक्षम होना है; और मौजूदा और काम करने वाले बंडलों के लिए कॉन्फ़िगरेशन को संशोधित किए बिना मौजूदा मार्गों पर स्वचालित रूप से लागू होते हैं। यह है, इसका समर्थन करने के लिए ए, बी, और सी में संशोधन करने के लिए स्वीकार्य है, जब तक कि परिवर्तन ए, बी, और सी को चलाने के लिए एम पर भरोसा नहीं करते हैं (यानी, एबीसी अभी भी एम के बिना चलाना चाहिए)।

यदि इंटरसेप्टरों का उपयोग करने से ऐसा करने का बेहतर माध्यम है, तो मैं इसके लिए खुला हूं। प्राथमिक लक्ष्य हैं:

  1. एम से decoupled (विशेष रूप से विकास के दौरान)
  2. सुनिश्चित ए, बी के साथ एम एकीकृत एक रखें, बी, और सी, और सी
  3. एम करने की अनुमति दें संभव के रूप में आसान है मैन्युअल रूप से ए, बी, या सी

उत्तर

4

मुझे नहीं लगता कि यह InterceptorStrategy का उपयोग कर संभव है क्योंकि यह अपेक्षा करता है कि यह उसी ऊंट संदर्भ में चल रहा है। कई संदर्भों में काम करने के बारे में मुझे पता है कि एकमात्र तरीके वीएम एंडपॉइंट (जो स्पष्ट रूप से एक ही जेवीएम तक सीमित है) का उपयोग कर रहा है, हालांकि इस मामले में आप शायद जेएमएस, जेएमएक्स या इसी तरह के कुछ का बेहतर उपयोग करेंगे।

JMS

A, B & C कि M

intercept().bean(transformForMonitoring).to("jms:queue:monitoring"); 

from("whatever:endpoint") 
    .process(myProcessor) 
    .to("target:endpoint"); 

के लिए अपने संदेश को प्रकाशित करता है में एक ऊंट संदर्भ के लिए एक InterceptorStrategy बनाएं अगर आपको की भूमि के ऊपर नहीं चाहते intercept() पर vm घटक इस्तेमाल कर सकते हैं जेएमएस, हालांकि यह आपके निगरानी घटक को एक एकल जेवीएम में सीमित करता है।

JMX

इसमें कुछ समय अधिक जटिल है, लेकिन मूल विचार के लिए A, B & C

<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring"> 
    <jmxAgent id="agent" mbeanObjectDomainName="your.domain.name"/> 
    ... 
</camelContext> 

MBeans प्रकाशित और उसके बाद M के लिए JVM MBean सर्वर से कनेक्ट ऊंट संदर्भ बताने के लिए है और एक्सचेंजों पर प्रतिक्रिया करने के लिए NotificationListener जैसे कुछ का उपयोग करें।

+1

को ढूंढने में मदद करता है, मुझे आपके द्वारा प्रस्तुत किए गए विचार पसंद हैं, लेकिन एक ऐसा मुद्दा है जो मेरे विवरण से स्पष्ट नहीं था: निगरानी कोड के कुछ चरणों की आवश्यकता है 'ए',' बी', और 'सी' में मार्गों में समकालिक रूप से निष्पादित किया जाना चाहिए (क्योंकि वे, उदाहरण के लिए, 'एक्सचेंज' पर गुण सेट करते हैं), इसलिए संदेशों को एक अतुलनीय कतार में निर्देशित करना अपर्याप्त है। मैं देखता हूं कि ऊंट 2.16.0 में डायरेक्ट-वीएम घटक एक मौजूदा उपभोक्ता स्थिति को संभालने में सक्षम होगा, जो इस मुद्दे को हल करेगा। क्या आप कैमेल 2.12.0 में उपलब्ध किसी भी समान तंत्र के बारे में जानते हैं जो सिंक्रोनस-लेकिन-वैकल्पिक रूटिंग के लिए अनुमति देगा? – VeeArr

+0

नहीं, कोई भी ऊंट संदर्भों में काम नहीं करेगा, जब तक आप इंटरसेप्टर में किसी वेब सेवा कॉल की तरह कुछ उपयोग नहीं करना चाहते हैं और कोई श्रोता नहीं होने पर किसी भी अपवाद को निगलें .. – stringy05

1

या तो स्प्रिंग-डीएम का उपयोग करें, या अपने सभी वसंत एक्सएमएल आधारित मार्गों को ब्लूप्रिंट करने के लिए बेहतर रूप से परिवर्तित किए बिना एकीकृत किया जाए। Karaf/Osgi में एक्सएमएल आधारित रूट्स का उपयोग करने का यह सबसे अच्छा तरीका है।

+0

क्या आप उदाहरण दे सकते हैं कि स्प्रिंग-डीएम कैसे मदद कर सकता है? यह उन चीज़ों में से एक है जिन्हें मैंने मूल रूप से देखा था, लेकिन मेरे द्वारा उपयोग किए जाने वाले सभी समाधानों में बंडल ए, बी, और सी संशोधित करना शामिल था (उदाहरण के लिए '' टैग जोड़ने के लिए)। – VeeArr

+0

इस मामले में वसंत-डीएम सुनिश्चित करता है कि सभी वसंत संदर्भ ठीक से शुरू हो गए हैं, और आपके वसंत बीन्स की तारों को सही ढंग से संभाला जाता है। बेशक इसका उपयोग आपके आवेदन में इंजेक्शन के लिए ओजीआई सेवाओं को संदर्भित करने के लिए भी किया जाता है। –

+0

लेकिन यह अभी भी इस विशिष्ट मामले में मदद नहीं करता है (जहां तक ​​मैं बता सकता हूं कि बंडल को संशोधित किए बिना अन्य बंडलों में एक बीन उपलब्ध हो सकता है), जहां तक ​​मैं कह सकता हूं। – VeeArr

2

संभावना में से एक custom Tracer को बंडल 'एम' में परिभाषित करता है और इसे ओजीआई सेवा के रूप में निर्यात करता है।

बंडल एक में, बी, सी ट्रेस सक्षम करने के लिए निर्यात किया ट्रेसर सेम

उपयोग camel JMX को OSGi-संदर्भ परिभाषित करते हैं।

यह बंडल एक में परिवर्तन परिणाम होगा, बी, सी, लेकिन यह कम से कम हो जाएगा और यह भी और एकीकृत करने की योग्यता दे देंगे अनुरेखण (अवरोध उत्पन्न कर रहा)

मैं इस अपने आप को प्रयास नहीं किया है कॉन्फ़िगर करते हैं, लेकिन hth

+0

हमने कुछ ऐसा करने की कोशिश की है। इस दृष्टिकोण के साथ समस्या यह है कि बंडल ए, बी, और सी एम के बिना शुरू नहीं होगा, क्योंकि ओजीआई: संदर्भ संतुष्ट नहीं होगा। क्या इसके चारों ओर एक रास्ता है? – VeeArr

+1

यदि आप वसंत-डीएम का उपयोग कर रहे हैं ... आप संदर्भ पर कार्डिनिटी [0..1] सेट कर सकते हैं, यदि आप संदर्भ में संदर्भ इंटरफ़ेस के लिए वैकल्पिक रूप से संकल्प सेट करने का प्रयास नहीं कर सकते हैं? – blob

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