2016-02-16 12 views
6

Witam Próbuję załadować plik drl z systemu plików w drools 6.3.0. Mam kod z projektu drools. Kod, który jest używany do ładowania pliku drl, jest następujący.jak załadować plik drl z systemu plików w 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(); 
    } 
} 

Tutaj Baza wiedzy jest przestarzała. Czy istnieje alternatywa dla bazy wiedzy? Jeśli istnieje jakakolwiek alternatywa, proszę podać mi przykładowy kod. Nie chcę kopiować pliku drl w folderze zasobów aplikacji. Każda pomoc jest doceniana. Na końcu zrobiłem to w następujący sposób:

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

Wierzę, że Baza wiedzy i przyjaciele zostają zastąpieni przez KieServices.Factory.Get(), a następnie za pomocą KieServices, aby stworzyć wszystko, czego potrzebujesz. – pandaadb

+0

Działa również dobrze w wersji 6.4.0. Finał. Dziękisssssssss! – capcom923

+0

I działa w wersji 7.4.0. Finał!! Dzięki! – jjmartinez

Odpowiedz

1

używam Drools 6.3.0 i mogę załadować reguły od A .drl plik używając następującego kodu.

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

Mam plik reguł w katalogu resources/rules.

+0

Witam Madhu. Znalazłem rozwiązanie zobacz mój powyższy przykładowy kod. Nie chcę przechowywać pliku drl w ścieżce klas. Zachowałem to w systemie plików. – chandra

Powiązane problemy