2016-02-16 2 views
6

हाय मैं drools 6.3.0 में फ़ाइल सिस्टम से ड्रिल फ़ाइल लोड करने का प्रयास कर रहा हूं। मुझे डोलॉल्स प्रोजेक्ट से कोड मिला। कोड जो ड्रिल फ़ाइल लोड करने के लिए प्रयोग किया जाता है, निम्नानुसार है।drools में फ़ाइल सिस्टम से ड्रिल फ़ाइल को लोड करने के लिए कैसे करें 6.3.0

package org.drools.examples.banking; 

import org.kie.internal.KnowledgeBase; 
import org.kie.internal.KnowledgeBaseFactory; 
import org.kie.internal.builder.KnowledgeBuilder; 
import org.kie.internal.builder.KnowledgeBuilderFactory; 
import org.kie.internal.definition.KnowledgePackage; 
import org.kie.internal.io.ResourceFactory; 
import org.kie.internal.runtime.StatefulKnowledgeSession; 
import org.kie.api.io.ResourceType; 

import java.util.Collection; 

public class RuleRunner { 

    public RuleRunner() { 
    } 

    public void runRules(String[] rules, 
         Object[] facts) { 

     KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); 
     KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); 

     for (int i = 0; i < rules.length; i++) { 
      String ruleFile = rules[i]; 
      System.out.println("Loading file: " + ruleFile); 
      kbuilder.add(ResourceFactory.newClassPathResource(ruleFile, 
                     RuleRunner.class), 
            ResourceType.DRL); 
     } 

     Collection<KnowledgePackage> pkgs = kbuilder.getKnowledgePackages(); 
     kbase.addKnowledgePackages(pkgs); 
     /*ResourceFactory.getResourceChangeNotifierService().start(); 
     ResourceFactory.getResourceChangeScannerService().start(); 
     */ 
     StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); 

     for (int i = 0; i < facts.length; i++) { 
      Object fact = facts[i]; 
      System.out.println("Inserting fact: " + fact); 
      ksession.insert(fact); 
     } 

     ksession.fireAllRules(); 
    } 
} 

यहां नॉलेजबेस को बहिष्कृत किया गया है। नॉलेजबेस के लिए कोई विकल्प है। यदि कोई विकल्प मौजूद है तो कृपया मुझे इसके लिए नमूना कोड प्रदान करें। मैं आवेदन के संसाधन फ़ोल्डर में ड्रिल फ़ाइल की प्रतिलिपि नहीं बनाना चाहता हूं। किसी भी मदद की सराहना की है।

KieServices kieServices = KieServices.Factory.get(); 
     KieFileSystem kfs = kieServices.newKieFileSystem(); 
     kfs.write(ResourceFactory.newFileResource(new File("C:/Users/ab/Desktop/fly.drl"))); 
     KieBuilder kieBuilder = kieServices.newKieBuilder(kfs).buildAll(); 
     KieContainer kieContainer = kieServices.newKieContainer(kieServices.getRepository().getDefaultReleaseId()); 
     KieSessionConfiguration conf= SessionConfiguration.getDefaultInstance(); 
     KieSession ksession = kieContainer.newKieSession(conf); 
     if (kieBuilder.getResults().hasMessages(Level.ERROR)) { 
      List<Message> errors = kieBuilder.getResults().getMessages(Level.ERROR); 
      StringBuilder sb = new StringBuilder("Errors:"); 
      for (Message msg : errors) { 
       sb.append("\n " + msg); 
      } 
      throw new Exception(sb.toString()); 
     } 

     System.out.println("KieServices built: "); 
+0

मेरा मानना ​​है कि नॉलेजबेस और दोस्तों को KieServices.Factory.Get() द्वारा प्रतिस्थापित किया गया है और फिर KieServices का उपयोग करके जो भी आपको चाहिए उसे बनाने के लिए। – pandaadb

+0

यह 6.4.0 में भी ठीक काम करता है। अंतिम। Thankssssssssss! – capcom923

+0

और यह 7.4.0 में काम करता है। अंतिम!! धन्यवाद! – jjmartinez

उत्तर

1

मैं Drools 6.3.0 का उपयोग कर रहा है और मैं निम्नलिखित कोड का उपयोग कर एक .drl फ़ाइल से नियम लोड कर सकते हैं: इस प्रकार अंत में मैंने किया।

KieServices ks = KieServices.Factory.get(); 
KieRepository kr = ks.getRepository(); 
KieFileSystem kfs = ks.newKieFileSystem(); 

kfs.write(ResourceFactory.newClassPathResource("rules/ruleset.drl", this.getClass())); 

KieBuilder kb = ks.newKieBuilder(kfs); 

kb.buildAll(); // kieModule is automatically deployed to KieRepository if successfully built. 
if (kb.getResults().hasMessages(Message.Level.ERROR)) { 
    throw new RuntimeException("Build Errors:\n" + kb.getResults().toString()); 
} 

KieContainer kContainer = ks.newKieContainer(kr.getDefaultReleaseId()); 

KieSession kSession = kContainer.newKieSession(); 

for (int i = 0; i < facts.length; i++) { 
    Object fact = facts[i]; 
    System.out.println("Inserting fact: " + fact); 
    kSession.insert(fact); 
} 

System.out.println("Fire All Rules..."); 
kSession.fireAllRules(); 
kSession.dispose(); 

मेरे पास संसाधन/नियम निर्देशिका के अंदर मेरी नियम फ़ाइल है।

+0

हाय मधु। मैंने पाया कि समाधान मेरे उपरोक्त नमूना कोड को देखता है। मैं क्लासपाथ में ड्रिल फ़ाइल नहीं रखना चाहता हूं। मैंने इसे फाइल सिस्टम में रखा है। – chandra

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

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