2011-04-27 7 views
7

मुझे एक बुद्धिमान प्रणाली है जो उपलब्ध ओएसजीआई सेवाओं के बीच गतिशील रूप से चुन सकती है। यही है, कुछ रनटाइम पैरामीटर के आधार पर एक कार्यान्वयन या दूसरा चुनें। उदाहरण के लिए, एक चल रहे एल्गोरिदम को सूचित करें जो कई पुनरावृत्तियों के बाद ऑपरेटर को बदलता है, या किसी सिस्टम या लोड में लोड संतुलन के आधार पर।एक बुद्धिमान तरीके से कई ओएसजीआई सेवाओं के बीच रनटाइम में कैसे चयन करें?

while(stopCriterion){ 
    operator.doSomething(); //There exist many operator implementations 
} 

मेरा पहला दृष्टिकोण डी एस उपयोग करने के लिए सेवाओं को बेनकाब और 0..n और गतिशील नीति के साथ सेवाओं बाध्य करने के लिए है। फिर, बाहरी बुद्धिमान घटक से, प्रत्येक पुनरावृत्ति में उपयोग की जाने वाली एल्गोरिदम को सूचित करें (EventAdmin का उपयोग करके, शायद?)।

operator[selected].doSomething(); 

यह मदद कर सकता है मुझे जटिलता को कम करने के लिए जब विभिन्न सेवा कार्यान्वयन का एक बहुत के साथ कई प्रयोगों निष्पादित किया जाना चाहिए। इसके अलावा, मैं Eclipse Communication Framework साथ रिमोट सेवाएं विनिर्देश उपयोग करने के लिए वितरित एल्गोरिदम में अनुसंधान और सामान बनाने के लिए योजना बना रहा हूँ, इसलिए

हालांकि, मैं अगर यह एक है पता नहीं है निष्पादन समय में नए कार्यान्वयन के गतिशील प्रदर्शित होने के भी संभव हो सकता है अच्छा विचार या गतिशील रूप से कार्यान्वयन का उपयोग करने के लिए एक और बेहतर तंत्र मौजूद है। मुझे लगता है कि सर्विसट्रैकर का उपयोग कर डीएस एक अच्छा विकल्प नहीं है, लेकिन मैं सुझावों के लिए खुला हूं :)

अग्रिम धन्यवाद।

उत्तर

5

यह मुझे एक रणनीति पैटर्न की तरह दिखता है, जो सेवाओं का उपयोग करके बहुत अच्छी तरह से लागू किया जा सकता है। मान लें कि आप सेवा का एक प्रकार Operator कहा जाता है (और एक ही नाम के साथ एक अंतरफलक है) है, यह इस तरह मोटे तौर पर काम करेगा:

  • एक OperatorProvider सेवा है, जो आवश्यक कार्यक्षमता शामिल हैं, और कुछ अतिरिक्त जानकारी बनाएं (जैसे जैसे, यह कार्यान्वयन कब उपयुक्त है), और इसके कई उदाहरण बनाएं, आपकी प्रत्येक रणनीति के लिए एक।
  • एक चयनकर्ता सेवा बनाएं, जो Operator इंटरफ़ेस लागू करती है, और चैनल सभी सेवा को सबसे उपयुक्त OperatorProvider पर कॉल करते हैं। जिस तरीके से यह सेवा सबसे उपयुक्त प्रदाता का चयन करती है, वह शायद बुद्धि का हिस्सा है।
  • सेवा के वास्तविक उपयोगकर्ता को अब केवल Operator सेवा पर निर्भरता है, और प्रदाता चयन के बारे में चिंता करने की आवश्यकता नहीं है।

मैं तुम्हें चयनकर्ता सेवा में चयन रणनीति डाल सकते हैं मान, लेकिन अगर यह सच में एक बाहरी घटक है, तो आप आप बुद्धिमान घटक और चयनकर्ता के बीच संचार को संभालने के लिए पसंद के किसी भी प्रणाली का उपयोग कर सकते हैं: एक सेवा इंटरफ़ेस , घटनाओं, आदि

+0

हाय एंडी। मुझे उचित उदाहरण का चयन करने के लिए मध्यवर्ती चयनकर्ता सेवा के बारे में आपका विचार पसंद है :) हालांकि, "ऑपरेटर" और "एल्गोरिदम" के डेवलपर्स शायद ओएसजीआई से परिचित नहीं हैं, और मुझे लगता है कि चयनकर्ता उन्हें भ्रमित कर सकता है। वैसे भी, मैंने आपकी समस्या को हल करने के लिए आपकी टिप्पणी को एक सुंदर रूप पाया। अगर कोई मुझे कोई दूसरा समाधान नहीं देता है, तो मैं आपके उत्तर को "चेक" के रूप में चिह्नित करूंगा (यह स्टैक ओवरफ्लो में मेरा पहला प्रश्न है, मुझे नहीं पता कि मैंने जवाब से अधिक जांच कर या मेरी पसंद को संशोधित कर सकते हैं)। –

+0

ऑपरेटर-कार्यान्वयनकर्ताओं को ओएसजीआई के बारे में बहुत कुछ जानने की आवश्यकता नहीं है, जब तक वे सही इंटरफ़ेस को लागू करते हैं। एक उत्तर स्वीकार करने के लिए: मुझे नहीं लगता कि आप अपनी पसंद को संशोधित कर सकते हैं, इसलिए बुद्धिमानी से चयन करें। (या अधिक मार्गदर्शन के लिए [faq] (http://stackoverflow.com/faq) देखें।) –

+0

धन्यवाद एंजेलो (एंडी नहीं!)। आपका विचार अच्छा है क्योंकि चयनकर्ता अन्य सेवाओं को भी बाध्य कर सकता है जो "एल्गोरिदम" जानकारी निकालने के लिए उपयोग करता है :) (मैं अभी तक आपके उत्तर को ऊपर नहीं उठा सकता, मुझे और अधिक प्रतिष्ठा की आवश्यकता है)। –

0

मुझे लगता है कि, या गतिशील रणनीति पैटर्न में किसी प्रकार का भी निर्भरता इंजेक्शन अपनी आवश्यकताओं फिट सकता। कुछ वर्ग एक रणनीति का उपयोग करता है (आपने इसे ऑपरेटर कहा) जो रनटाइम पर बदल सकता है। मुझे लगता है, आपके पास एक और सेवा है जो बता सकती है कि किस रणनीति का उपयोग करना है (रनटाइम पैरामीटर के आधार पर)।

एक किसी न किसी तरह कार्यान्वयन कि दिखाई देगा:

public Worker { 
    private Operator operator; // your actual operator strategy 
    public void setOperator(Operator actualOperator) { 
    this.operator = operator; 
    } 

    public doSomething() { 

    while(stopCriterion) { 
     Operator operatorForThisIteration = operator; // pick the injected service 
     operatorForThisIteration.doSomething; 
    } 
    } 
} 

और एक और सेवा, एक है कि कार्यकर्ता उदाहरणों के लिए उनकी निर्भरता इंजेक्षन कर सकते हैं, सभी कार्यकर्ता की कई घटनाओं के बनाए रखना होगा, एक नई सेवा का चयन करने के लिए कुछ तर्क लागू और सभी (या कुछ) श्रमिकों में इंजेक्ट करें।

+0

हाय एंड्रियास। मैं ओएसजीआई क्षमताओं का उपयोग कर ढीला युग्मन खोज रहा हूं। "खुफिया" "वर्कर" (और वैकल्पिक) के बाहर होना चाहिए लेकिन श्रमिकों का प्रबंधन नहीं करना चाहिए। फिर भी मैं अन्य समस्याओं में इसका उपयोग करने के लिए आपके विचार को नोट करता हूं;) –

+0

@ पाब्लो - युग्मन बहुत ढीला है, 'ऑपरेटर' एक इंटरफ़ेस है और सेवा कार्यान्वयन नहीं है ..! –

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