2011-02-03 8 views
9

इस आवेदन में कि मैं अभी इस पर काम कर रहा हूं, मुझे समय-समय पर किसी प्रकार की सेवा के लिए हजारों वस्तुओं की योग्यता की जांच करने की आवश्यकता है। निर्णय आरेख स्वयं निम्न रूप में है, बस बड़ा तरीका: Decision diagramनिर्णय पेड़ और नियम इंजन (Drools)

प्रत्येक अंत नोड्स (मंडल) में, मुझे एक क्रिया चलाने की आवश्यकता है (किसी ऑब्जेक्ट के फ़ील्ड को बदलें, लॉग जानकारी इत्यादि)। मैंने ड्रोल विशेषज्ञ फ्रेमवर्क का उपयोग करने की कोशिश की, लेकिन उस स्थिति में मुझे आरेख में प्रत्येक पथ के लिए एक लंबा नियम लिखना होगा जिससे अंत नोड हो सके। इस तरह के उपयोग के मामले में ड्रोल्स फ्लो का निर्माण नहीं किया जाता है - मैं एक वस्तु लेता हूं और फिर, रास्ते में फैसलों के आधार पर, मैं अंत नोड्स में से एक में समाप्त होता हूं; और फिर फिर एक और वस्तु के लिए। या यह है? क्या आप मुझे ऐसे समाधानों के लिए कुछ उदाहरण/लिंक दे सकते हैं?

अद्यतन:

Drools प्रवाह कॉल इस प्रकार दिखाई देंगे:

// load up the knowledge base 
KnowledgeBase kbase = readKnowledgeBase(); 
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); 
Map<String, Object> params = new HashMap<String, Object>(); 

for(int i = 0; i < 10000; i++) { 

    Application app = somehowGetAppById(i); 

    // insert app into working memory 
    FactHandle appHandle = ksession.insert(app); 

    // app variable for action nodes 
    params.put("app", app); 

    // start a new process instance 
    ProcessInstance instance = ksession.startProcess("com.sample.ruleflow", params); 
    while(true) { 
     if(instance.getState() == instance.STATE_COMPLETED) { 
      break; 
     } 
    } 

    // remove object from working memory 
    ksession.retract(appHandle); 
} 

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

समाधान:
मैं Drools प्रवाह का उपयोग कर समाप्त हो गया है और यह काफी ठीक काम कर रहा है। मेरी निर्णय प्रक्रिया उतनी सरल नहीं है जितनी डोलॉल्स विशेषज्ञ पूछती है कि निर्णय पेड़ में कहां प्रक्रिया है, इसे डेटाबेस से ऑब्जेक्ट्स की सूचियां लोड करने, उन्हें बदलने, निर्णय लेने, सबकुछ लॉग करने आदि की आवश्यकता है। मैं प्रोसेस ऑब्जेक्ट का उपयोग करता हूं जो प्रक्रिया के लिए एक पैरामीटर के रूप में पारित किया जाता है और मेरे सभी वैश्विक चर (प्रक्रिया के लिए) और कुछ सुविधाजनक विधियों को पेड़ में अलग-अलग बिंदुओं पर दोहराया जाता है (जैसे Script Task नोड्स में जावा कोड लिखना बहुत सुविधाजनक नहीं है)। मैंने निर्णय लेने के लिए जावा का उपयोग भी समाप्त कर दिया (और mvel या नियम नहीं) - यह तेज़ है और मैं नियंत्रण करना आसान कहूंगा। जिन ऑब्जेक्ट्स के साथ मैं काम करता हूं उन्हें पैरामीटर के रूप में पास किया जाता है और कोड में सामान्य जावा चर के रूप में उपयोग किया जाता है।

उत्तर

12

ड्रोल्स विशेषज्ञ निश्चित रूप से जाने का तरीका है।

आप उच्च नोड्स के लिए अपने आप को दोहरा से बचने के लिए चाहते हैं, तो चाल insertLogical उपयोग करने के लिए (या बस insert यदि आप एक राज्यविहीन सत्र में हैं) और यह समझना चाहिए कि नियमों नियमों को गति प्रदान कर सकते हैं (यह अपने पिता के एसक्यूएल नहीं है क्वेरी)। उदाहरण के लिए:

// we just insert Customer objects in the WM 

rule "evaluateRetired" 
when 
    $c : Customer(age > 65) 
then 
    insertLogical(new Retiree($c)); 
end 

rule "evaluteRetireeIsFemale" 
when 
    $r : Retiree(customer.gender == Gender.FEMALE, $c : customer) 
then 
    ... 
end 

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

+0

इसके अलावा, जैसे ही आपका निर्णय वृक्ष बढ़ता है, आप पाएंगे कि कुछ अंत नोड क्रियाएं साझा करते हैं (उदाहरण के लिए सभी रिट्रीरी को पेंशन प्राप्त करने की आवश्यकता है, उनके लिंग का अप्रासंगिक) और यह प्रति अंत-नोड कार्रवाई को फिर से घोषित करने में अक्षम है। –

+0

डोलॉल्स प्रवाह के बारे में क्या? मैं इसका उपयोग करके निर्णय पेड़ का मॉडल कर सकता हूं और फिर मैं एक ऑब्जेक्ट को वर्किंग मेमोरी में डाल सकता हूं, प्रक्रिया शुरू कर सकता हूं और यह तय कर सकता हूं कि कौन सा अंत नोड लेना है, फिर वस्तु को बाहर निकालें, एक और डालें, इसे फिर से शुरू करें ? क्या यह एक स्पष्ट समाधान नहीं है? –

+0

Drools प्रवाह समझ में नहीं आता है। यह नहीं कह रहा कि यह काम नहीं कर सका, लेकिन चूंकि आप निर्णय ले रहे हैं, इसलिए नियम इंजन के साथ लागू एक निर्णय तालिका अधिक तार्किक/प्राकृतिक महसूस करती है। वर्कफ़्लो में फिट करने की कोशिश करना wierd है: वर्कफ़्लो लंबे समय तक रहता है, प्रत्येक नोड एक राज्य है। –

-1

आप आईएलओजी फ्रेमवर्क सह नियम इंजन का प्रयास कर सकते हैं।

+1

धन्यवाद, लेकिन iLog अनावश्यक रूप से जटिल लगता है। मैं एक दुबला समाधान की तलाश में हूँ। –

+0

जेएसआर 94 पर आधारित जावा नियम इंजन एपीआई के बारे में कैसे? जेस भी कहा जाता है। आप इस लिंक पर एक सूची पा सकते हैं: http://java-source.net/open-source/rule-engines – Sid

+2

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

0

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