java-Drools6 规则流的问题

问题描述

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);** 这句代码, 所以导致报错,,,
不知道大家有过规则流这方面的接触没有, 本人菜鸟到处找资料,然并卵,,, 百度也无力了...

解决方案

第四天:Drools规则中文化

解决方案二:

是在module中配置kase,ksession吗?

时间: 2024-11-02 11:14:32

java-Drools6 规则流的问题的相关文章

【转】Java I/O流概念分析整理

转载地址:http://blog.csdn.net/yuebinghaoyuan/article/details/7388059  Java中的流,可以从不同的角度进行分类. 按照数据流的方向不同可以分为:输入流和输出流. 按照处理数据单位不同可以分为:字节流和字符流. 按照实现功能不同可以分为:节点流和处理流. 输出流: 输入流: 因此输入和输出都是从程序的角度来说的. 字节流:一次读入或读出是8位二进制. 字符流:一次读入或读出是16位二进制. 字节流和字符流的原理是相同的,只不过处理的单位

求大神解答一下-java中对象流objectstream问题

问题描述 java中对象流objectstream问题 输出的为什么不是cyh男20 ym女20求大神解答!!!!!!!!!! 解决方案 你的代码和我这个一样吗?麻烦把你的代码粘全了,我看看 解决方案二: 这个是照片......... 解决方案三: 我和你写的差不多,不知道你为啥会这样,我给你粘出我的代码package lianxi; import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOE

数据库-java中的流属于工具类吗,还是属于一种数据类型?

问题描述 java中的流属于工具类吗,还是属于一种数据类型? 数据库存储的blob类型数据不应该是一串二进制数吗,为什么都说它是二进制流. 解决方案 工具类都在这个java.util中定义, 你看包就知道了 流是专门处理Io的. 有一套对应的类来支持它 数据库存储的blob类型数据不应该是一串二进制数吗,为什么都说它是二进制流 存储的数据是二进制数,但是这个二进制数的格式是某个对象的 这就是流对象. 你要通过流对象读出二进制数啊 这和你用流读取一个二进制文件是一样的 解决方案二: 流是一种抽象类

Java中IO流缓冲区的装饰模式的体现

一.Java中IO流缓冲区 import java.io.*; public class BufferedTest {public static void copy1(){InputStream is = null;OutputStream os = null;try{is = new FileInputStream("c:\\xy1.jpg");os = new FileOutputStream("d:\\xy2.jpg");int len = 0;byte[]

Java IO包装流如何关闭

问题: (1)JAVA的IO流使用了装饰模式,关闭最外面的流的时候会自动调用被包装的流的close()方吗? (2)如果按顺序关闭流,是从内层流到外层流关闭还是从外层到内存关闭? 问题(1)解释: 如下例子代码: 1 2 3   FileInputStream is = new FileInputStream(".");      BufferedInputStream bis = new BufferedInputStream(is);     bis.close(); 从设计模式上

求教有关于JAVA的规则引擎类知识?

问题描述 为了学校论文,求教有关于JAVA的规则引擎类知识!(最好能提供相关的产品用来研究)如果有,那类似的产品一共有哪些?国内有吗? 解决方案 解决方案二:引用楼主womo123的回复: 为了学校论文,求教有关于JAVA的规则引擎类知识!(最好能提供相关的产品用来研究)如果有,那类似的产品一共有哪些?国内有吗? Java开源规则引擎Drools不错相关文档知识也比较多解决方案三:给你一个开源规则引擎主要有哪些引用1楼xiaoye2892的回复: 引用楼主womo123的回复:为了学校论文,求教

i/o-关于java I/O流的问题 求大神指点

问题描述 关于java I/O流的问题 求大神指点 在d盘中新建a文件夹,里面再次新建b子文件夹,在b文件夹中新建test.txt文件,并输入姓名+年龄. 解决方案 java I/O流Java I/O流java中的I/O流 解决方案二: http://blog.csdn.net/qiaqia609/article/details/11048463 解决方案三: public static void main(String[] args) throws IOException { System.o

字节流-JAVA缓冲字符流在实例化传入的必须是字符流吗?

问题描述 JAVA缓冲字符流在实例化传入的必须是字符流吗? 缓冲字符流在实例化传入的必须是字符流吗?可以传入 InputStream或OutputStream吗? 今天看代码遇到了这样的写法,不知道这种写法对不对,求告知原因! OutputStream os=new FileOutputStream("pw.txt",true); PrintWriter pw = new PrintWriter(os,true); 解决方案 首先你得捕获异常,应该这样 OutputStream os

《精通Spring MVC 4》——2.8 Java 8的流和lambda表达式

2.8 Java 8的流和lambda表达式 可能你对lambda还不太了解,在Java 8中,每个集合都会有一个默认的方法stream(),它能够实现函数式风格的操作. 这些操作可以是中间操作(intermediate_operation),它会返回一个流,这样就能将其连接起来,也可以是终止操作(terminal operation),这样的话会返回一个值. 最著名的中间操作如下所示. map:它会为列表中的每个元素都应用某个方法,并返回结果所组成的列表: filter:它会返回匹配断言的所有