规则引擎版本,drools6.5.0 final
eclipse:Neon
JDK1.8
今天主要是在规则的when部分加入了多个fact对象。
对于working memory存在多个fact的情形,其实和单个fact对象是类似的。需要注意的是,我们需要将多个多想都要插入working memory中才行。
下面是试验的代码,之前我已经在eclipse上安装了drools的插件,所以我的代码是在drools生成的木板上直接进行修改的。
针对本次试验,重要的几个文件如下
package com.audi.dto;public class TestDTO{ private String condition; private String action; public String getCondition() { return condition; } public void setCondition(String condition) { this.condition = condition; } public String getAction() { return action; } public void setAction(String action) { this.action = action; } }
package com.audi.util;public class TestUtils{ public static String testDrl() { return "true"; }}
下面的这段代码是规则的内容(其实语法和java很相似),注意下面的import语句,要在包名的末级加上*号,否则会报错:
package com.sample import com.audi.dto.*;import com.audi.util.*; rule "testUtil" when $util:TestUtils(); $dto:TestDTO($util.testDrl()=="true"); then $dto.setAction("sucess..."); System.out.println("------------hhhhhhhhhhhhhhh-------------");end
下面是drools自动生成的xml文件,其实就是配置drools的三种规则文件的方式:
下面是规则的测试代码,尤其要注意kSession.insert(new TestUtils());这一句,这就是把这个工具类插入working memory的代码,没了它会导致规则的when部分为false,从而导致规则匹配失败。
package com.sample;import org.kie.api.KieServices;import org.kie.api.runtime.KieContainer;import org.kie.api.runtime.KieSession;import com.audi.dto.TestDTO;import com.audi.util.TestUtils;/** * This is a sample class to launch a rule. */public class DroolsTestUtil{ public static final void main(String[] args) { try { // load up the knowledge base KieServices ks = KieServices.Factory.get(); KieContainer kContainer = ks.getKieClasspathContainer(); KieSession kSession = kContainer.newKieSession("ksession-rules"); // go ! TestDTO dto = new TestDTO(); dto.setCondition("test"); kSession.insert(new TestUtils()); kSession.insert(dto); kSession.fireAllRules(); System.out.println("------------开始匹配-------------"); if (null == dto.getAction()) { System.out.println("------------匹配失败-------------"); } else { System.out.println("------------匹配成功-------------"); System.out.println(dto.getAction()); } } catch (Throwable t) { t.printStackTrace(); } }}