2016-02-16 6 views
6

こんにちは私は、drools 6.3.0のファイルシステムからdrlファイルをロードしようとしています。 私はdroolsプロジェクトからコードを得ました。 drlファイルのロードに使用されるコードは次のとおりです。ファイルシステムからdrolsファイルをロードする方法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(); 
    } 
} 

ここでは、KnowledgeBaseは推奨されていません。 KnowledgeBaseの代替手段はありますか?何か他の選択肢がある場合は、そのサンプルコードを親切に提供してください。私はアプリケーションのリソースフォルダにdrlファイルをコピーしたくありません。どんな助けもありがとうございます。最後に次のようにしました:

+0

私はKnowledgeBaseとフレンドが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(); 

私は自分のルールファイルをresources/rulesディレクトリ内に持っています。

+0

こんにちは。私は上記のサンプルコードを見て解決策を見つけました。私はクラスパスにdrlファイルを保存したくありません。私はファイルシステムに保管しました。 – chandra

関連する問題