哎哟还不错 2015-07-30 07:35 采纳率: 0%
浏览 5709

Drools6 规则流的问题

在Drools5老版本drl和**规则流xml**文件是通过KnowledgeBuilder 手动加载的,然后执行的过程和执行drl文件方式差不多,只是多了一句对Process的执行,也就是**ksession.startProcess("ruleflow.salary"); **完整代码引用示例:

 public class EmployTest2 {

    public static void main(String[] args) {

        try {
            // load up the knowledge base
            KnowledgeBase kbase = readKnowledgeBase();
            StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
            KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "test");

            // go !
            Employ emp = new Employ();
            emp.setEduInfo("master");
            emp.setResume("tech");
            emp.setAnnualExam("good");
            emp.setAwardPunish("award");

            ksession.insert(emp);
            ksession.startProcess("ruleflow.salary");
            ksession.fireAllRules();    
            System.out.println("Basic Salary: " + emp.getBasicSalary());
            System.out.println("Duty Salary: " + emp.getDutySalary());
            System.out.println("Bonus      : " + emp.getBonus());
            System.out.println("rate       : " + emp.getPercent());
            System.out.printf("Total Salary: %.0f" , emp.getTotalSalary());
            logger.close();
        } catch (Throwable t) {
            t.printStackTrace();
        }           

    }

    private static KnowledgeBase readKnowledgeBase() throws Exception {
        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
        kbuilder.add(ResourceFactory.newFileResource("./rules/EduInfoRule.drl"), ResourceType.DRL);
        kbuilder.add(ResourceFactory.newFileResource("./rules/ResumeRule.drl"), ResourceType.DRL);
        kbuilder.add(ResourceFactory.newFileResource("./rules/BonusRule.drl"), ResourceType.DRL);
        kbuilder.add(ResourceFactory.newFileResource("./rules/AwardPunish.drl"), ResourceType.DRL);
        kbuilder.add(ResourceFactory.newFileResource("./rules/TotalRule.drl"), ResourceType.DRL);
        kbuilder.add(ResourceFactory.newFileResource("./rules/saflow.xml"), ResourceType.BPMN2);
        KnowledgeBuilderErrors errors = kbuilder.getErrors();
        if (errors.size() > 0) {
            for (KnowledgeBuilderError error: errors) {
                System.err.println(error);
            }
            throw new IllegalArgumentException("Could not parse knowledge.");
        }
        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
        kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
        return kbase;
    }   

}

在Drools6的环境下执行这段规则流示例没有任何问题,而由于Drools6更新了全新的Kie API,所以现在碰到的问题就是使用KieAPI时并不能执行ksession.startProcess("ruleflow.salary");的逻辑,报错如下:
java.lang.IllegalArgumentException: Unknown process ID: ruleflow.salary

xml流文件配置如下:
...
type="RuleFlow" name="salary" id="ruleflow.salary" package-name="ruleflow" >

个人想到的原因可能是因为Drools6自动加载kmodule.xml文件指定下的包路径的drl文件, 而并没有加载流配置文件,就是老版本示例中的 ** kbuilder.add(ResourceFactory.newFileResource("./rules/saflow.xml"), ResourceType.BPMN2);** 这句代码, 所以导致报错,,,
不知道大家有过规则流这方面的接触没有, 本人菜鸟到处找资料,然并卵,,, 百度也无力了...

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 本题的答案是不是有问题
    • ¥15 关于#r语言#的问题:(svydesign)为什么在一个大的数据集中抽取了一个小数据集
    • ¥15 C++使用Gunplot
    • ¥15 这个电路是如何实现路灯控制器的,原理是什么,怎么求解灯亮起后熄灭的时间如图?
    • ¥15 matlab数字图像处理频率域滤波
    • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
    • ¥15 ELGamal和paillier计算效率谁快?
    • ¥15 蓝桥杯单片机第十三届第一场,整点继电器吸合,5s后断开出现了问题
    • ¥15 file converter 转换格式失败 报错 Error marking filters as finished,如何解决?
    • ¥15 Arcgis相交分析无法绘制一个或多个图形