2016-02-16 12 views
6

Merhaba Dosya sisteminden gelen drl dosyasını yazmayı deniyorum 6.3.5. Ben drools projeden kodu aldım. Drl dosyasını yüklemek için kullanılan kod aşağıdaki gibidir.drl dosyasını drools'taki dosya sisteminden yükleme 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(); 
    } 
} 

Burada Bilgi Bankası kullanımdan kaldırılmıştır. Bilgi Bankası için herhangi bir alternatif var mı? Herhangi bir alternatif varsa, bunun için bana örnek kod sağlayın. Drl dosyasını uygulamanın kaynak klasörüne kopyalamak istemiyorum. Herhangi bir yardım takdir edilir.

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

KnowledgeBase ve arkadaşlarının KieServices.Factory.Get() ile değiştirildiğini ve daha sonra ihtiyacınız olan her şeyi oluşturmak için KieServices'ı kullanacağına inanıyorum. – pandaadb

+0

Ayrıca, 6.4.0'da iyi çalışıyor. Nihai. Thankssssssssss! – capcom923

+0

Ve 7.4.0'da çalışıyor. Nihai !! Teşekkürler! – jjmartinez

cevap

1

Ben Drools 6.3.0 kullanıyorum ve aşağıdaki kodu kullanarak bir .drl dosyadan kuralları yükleyebilir: şöyle sonunda bunu yaptı.

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(); 

Kural dosyamın kaynakları/kurallar dizininde var.

+0

Merhaba Madhu. Çözümü yukarıdaki örnek koduma baktım. Drl dosyasını sınıf yolunda tutmak istemiyorum. Dosya sisteminde tuttum. – chandra

İlgili konular