इस आवेदन में कि मैं अभी इस पर काम कर रहा हूं, मुझे समय-समय पर किसी प्रकार की सेवा के लिए हजारों वस्तुओं की योग्यता की जांच करने की आवश्यकता है। निर्णय आरेख स्वयं निम्न रूप में है, बस बड़ा तरीका: निर्णय पेड़ और नियम इंजन (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
या नियम नहीं) - यह तेज़ है और मैं नियंत्रण करना आसान कहूंगा। जिन ऑब्जेक्ट्स के साथ मैं काम करता हूं उन्हें पैरामीटर के रूप में पास किया जाता है और कोड में सामान्य जावा चर के रूप में उपयोग किया जाता है।
इसके अलावा, जैसे ही आपका निर्णय वृक्ष बढ़ता है, आप पाएंगे कि कुछ अंत नोड क्रियाएं साझा करते हैं (उदाहरण के लिए सभी रिट्रीरी को पेंशन प्राप्त करने की आवश्यकता है, उनके लिंग का अप्रासंगिक) और यह प्रति अंत-नोड कार्रवाई को फिर से घोषित करने में अक्षम है। –
डोलॉल्स प्रवाह के बारे में क्या? मैं इसका उपयोग करके निर्णय पेड़ का मॉडल कर सकता हूं और फिर मैं एक ऑब्जेक्ट को वर्किंग मेमोरी में डाल सकता हूं, प्रक्रिया शुरू कर सकता हूं और यह तय कर सकता हूं कि कौन सा अंत नोड लेना है, फिर वस्तु को बाहर निकालें, एक और डालें, इसे फिर से शुरू करें ? क्या यह एक स्पष्ट समाधान नहीं है? –
Drools प्रवाह समझ में नहीं आता है। यह नहीं कह रहा कि यह काम नहीं कर सका, लेकिन चूंकि आप निर्णय ले रहे हैं, इसलिए नियम इंजन के साथ लागू एक निर्णय तालिका अधिक तार्किक/प्राकृतिक महसूस करती है। वर्कफ़्लो में फिट करने की कोशिश करना wierd है: वर्कफ़्लो लंबे समय तक रहता है, प्रत्येक नोड एक राज्य है। –