2014-12-19 7 views
7

संक्षेप में मैं रनटाइम पर नियम भंडार से नियम बनाना, संपादित करना और हटाना चाहता हूं। मुझे यह समझने में परेशानी हो रही है कि ड्रॉल्स 6+ में ऐसा कैसे करें।ड्रॉल्स 6 में प्रोग्रामेटिक रूप से नए ड्रॉल्स नियम बनाने का नया स्वीकार्य तरीका क्या है?

मैं drools (< = 5.6) के पिछले संस्करण में जानते हैं, एक .drl फ़ाइल की एक एक्सएमएल प्रतिनिधित्व और इसके साथ काम करने के लिए एक API था: https://docs.jboss.org/drools/release/5.6.0.Final/drools-expert-docs/html/ch04.html#d0e8052

5.6 के रूप में डोलॉल्स प्रलेखन इस बहिष्कृत इंगित करता है और यह 6 पर पूरी तरह से हटा दिया जाता है। मैं ऐसे एपीआई का उपयोग नहीं करना चाहता जो पहले से ही कोई प्रत्यक्ष अपग्रेड पथ नहीं है।

नियम संपादन के लिए उपयोगकर्ताओं को गुवेनर या वर्कबेंच यूआई का खुलासा करना वर्कफ़्लो आवश्यकताओं और वेब उपयोगकर्ता इंटरफेस की जटिलता के कारण यहां एक अच्छा फिट नहीं है। मैं जावा कोड से नियम बनाना और प्रबंधित करना चाहता हूं।

मैं नियमों को संशोधित करने और नियमों को संशोधित करने के लिए एक .drl फ़ाइल में स्ट्रिंग टेम्पलेट करने से बेहतर तरीका चाहता हूं। जावा से नए नियम बनाने के लिए प्रोग्रामेटिक रूप से क्या मौजूद है? मैंने बहुत सी खोज की है लेकिन इसके लिए जावा एपीआई कॉल का एक सेट नहीं दिख रहा है।

उत्तर

1

जावा कोड से नियम बनाने के लिए स्थिर API नहीं है। निश्चित रूप से, डीआरएल कंपाइलर के पार्सर के लिए एक एपीआई है, लेकिन यह स्थिर नहीं है और डीआरएल नियम वाक्यविन्यास के रूप में जटिल है, जो काफी है।

एक्सएमएल एक विकल्प था जहां कम से कम बाएं हाथ के सिंटैक्स काफी सरल थे, जो 5.2 (आईआईआरसी) के साथ समाप्त हुआ। अब आप सीई लिखने के कई अलग-अलग तरीकों के साथ संयुक्त जावा के पूर्ण अभिव्यक्ति वाक्यविन्यास और अधिक का उपयोग कर सकते हैं।

यदि आपके नियम असाधारण रूप से सरल हैं, तो आप नियमों के लिए एक मॉडल के साथ आ सकते हैं जिसे एक प्रबंधनीय एपीआई के साथ छेड़छाड़ की जा सकती है। अन्यथा, आपकी सबसे अच्छी शर्त एक टेक्स्ट एडिटर है (या, ज़ाहिर है, की वर्कबेंच)।

1

प्रोग्राम के रूप में नियम बनाने के लिए निर्मित रास्ता एक "Descr" धाराप्रवाह एपीआई, जो संकलक के एएसटी सीधे manipulates, पार्सर को दरकिनार पर आधारित है।

एएसटी से एक डीआरएल सन्निकटन पुनः प्राप्त करने के वर्ग org.drools.compiler.lang.api.DescrFactory

और वर्ग org.drools.compiler.lang.DrlDumper देखते हैं।

+0

ठीक है, लेकिन आप निर्मित पैकेजडिस्क का मूल्यांकन कैसे करते हैं? – Esk

6

अगर यह 'स्वीकार किए जाते हैं' तरीका है मैं नहीं जानता, लेकिन निम्न कोड के साथ मैं Drools 6. में

public KieContainer build(KieServices kieServices) { 
    KieFileSystem kieFileSystem = kieServices.newKieFileSystem(); 
    ReleaseId rid = kieServices.newReleaseId("com.example.rulesengine", 
     "model-test", "1.0-SNAPSHOT"); 
    kieFileSystem.generateAndWritePomXML(rid); 

    kieFileSystem.write("src/main/resources/rules.drl", 
     getResource(kieServices, "rules.drl")); 

    addRule(kieFileSystem); 

    KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem); 
    kieBuilder.buildAll(); 
    if (kieBuilder.getResults().hasMessages(Message.Level.ERROR)) { 
     throw new RuntimeException("Build Errors:\n" + 
      kieBuilder.getResults().toString()); 
    } 

    return kieServices.newKieContainer(rid); 
} 

private void addRule(KieFileSystem kieFileSystem) { 
    PackageDescrBuilder packageDescrBuilder = DescrFactory.newPackage(); 
    packageDescrBuilder 
      .name("com.example.model") 
      .newRule() 
      .name("Is of valid age") 
      .lhs() 
      .pattern("Person").constraint("age < 18").end() 
      .pattern().id("$a", false).type("Action").end() 
      .end() 
      .rhs("$a.showBanner(false);") 
      .end(); 

    String rules = new DrlDumper().dump(packageDescrBuilder.getDescr()); 
    kieFileSystem.write("src/main/resources/rule-1.drl", rules); 
} 

private Resource getResource(KieServices kieServices, String resourcePath) { 
    try { 
     InputStream is = Resources.getResource(resourcePath).openStream(); //guava 
     return kieServices.getResources() 
        .newInputStreamResource(is) 
        .setResourceType(ResourceType.DRL); 
    } catch (IOException e) { 
     throw new RuntimeException("Failed to load drools resource file.", e); 
    } 
} 

प्रोग्रामेटिक रूप से बनाने के नियमों के साथ .drl फ़ाइलों comine मैं Guava संसाधन वर्ग का उपयोग करें।

+0

वाह कि गतिशील नियम निर्माण के लिए DescFactory API बहुत अच्छा और लचीला लगता है। केवल, इसके लिए उपयोग का मामला क्या है? आप जावा में गतिशील नियम क्यों बनायेंगे? क्या डीआरएल नियम पहले स्थान पर बाहरी होने का मुद्दा नहीं है? –

+0

डीआरएल फ़ाइलों के नियमों के मौजूदा सेट को माइग्रेट करते समय यह उपयोगी होगा। यही वह है जिसे मैं वर्तमान में पूरा करने की कोशिश कर रहा हूं। – nixnayak

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