如何在drools 6.3.0

时间:2016-02-16 02:44:28

标签: java drools

您好我正在尝试从drools 6.3.0中的文件系统加载drl文件。 我从drools项目获得了代码。用于加载drl文件的代码如下。

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。知识库是否有其他选择。如果存在任何替代方案,请提供示例代码。我不想在应用程序的资源文件夹中复制drl文件。任何帮助表示赞赏。最后我做了如下:

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: ");

1 个答案:

答案 0 :(得分: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();

我的资源/规则目录中有我的规则文件。