首页  

drools简介及实例     所属分类 drools 浏览量 1264
6.5.0

drools可根据drl或者xml进行配置,可灵活的调整要运行的规则,处理方法,及规则匹配后的操作,
可以动态生成配置文件 


    
public interface StatelessRuleSession {
    void execute(Object object);
    void execute(Iterable objects);
}


例子1 drl文件



package dyyx.drools.test
import dyyx.drools.demo1.RuleContext  
import dyyx.drools.demo1.RuleHandler  

global RuleHandler rule_handler

rule "my first rule"                                                  
//规则优先级,优先级大的先执行
salience 2 
// 设置no-loop为true ,避免规则重新触发
// no-loop 设置为 false ,对Fact对象的修改 , 调用update ,会重新触发执行 ,简单的set 方法 不会重新触发执行
no-loop true                                                 

when
       // 查找workingMemory中符合括号内条件的RuleDomain对象 (并不是创建新的对象),然后将其重新命名为domain以供引用
       // 条件不满足,不会继续执行
       context: RuleContext(name == "tiger")
       // 调用规则处理对象 
       eval(rule_handler.check(context))                      
then
       context.setResult("rule match");
       System.out.println("rule match");
end




        String drl = Utils.readFromClassPath("drools/demo1.drl", null);	
		// 创建知识库
		KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
		// 加载drl规则文件
		kbuilder.add(ResourceFactory.newReaderResource(new StringReader(drl)),ResourceType.DRL);
		// 从知识库中获取规则包
		Collection<KnowledgePackage> pkgs = kbuilder.getKnowledgePackages();
		// 规则引擎添加规则包,添加相应的规则处理逻辑
		KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
		kbase.addKnowledgePackages(pkgs);
		// 创建规则引擎执行会话
		StatelessKnowledgeSession session = kbase.newStatelessKnowledgeSession();
		
		RuleHandler ruleHandler = new RuleHandler();
		
		// 设置全局变量, 这里传入的对象类型要与DRL文件中声明的一致
		session.setGlobal("rule_handler",ruleHandler);
		
        RuleContext context = new RuleContext();	
		context.setName("tiger");
		context.setAge(9);
		// 装载数据对象用于规则判断,执行规则引擎
		session.execute(context);
		System.out.println(context);
		
		context = new RuleContext();	
		context.setName("tiger");
		context.setAge(18);
		// 装载数据对象用于规则判断,执行规则引擎
		session.execute(context);
		System.out.println(context);
		
		context = new RuleContext();	
		//  ruleHandler 不会运行 
		context.setName("cat");
		context.setAge(18);
		// 装载数据对象用于规则判断,执行规则引擎
		session.execute(context);
		System.out.println(context);



例子1 完整代码

https://gitee.com/dyyx/droolsdemo/blob/master/src/main/java/dyyx/drools/demo1/Demo1Main.java





例子2 drl 


package com.dyyx.rules

import dyyx.drools.demo2.Product

rule "updateDistcount"
// update 之后不会重新触发执行
no-loop true
salience 2 

when
        product:Product(discount > 0);
then
        product.setDiscount(product.getDiscount() + 1);
        System.out.println(product.getDiscount());
        // 不调用 update otherRule 不会触发执行
        update(product);
end

rule "otherRule"
salience 3

when
    product : Product(discount > 1);
then
    System.out.println("otherRule run," + product.getDiscount());
end



		String drl = Utils.readFromClassPath("drools/demo2.drl", null);
		
		KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
		kbuilder.add(ResourceFactory.newReaderResource(new StringReader(drl)),ResourceType.DRL);
		Collection<KnowledgePackage> pkgs = kbuilder.getKnowledgePackages();
		KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
		kbase.addKnowledgePackages(pkgs);
		StatelessKnowledgeSession session = kbase.newStatelessKnowledgeSession();
			
        Product product = new Product();	
        // 调用 update 后会重新触发 otherRule 执行 ,otherRule 两次都匹配
        product.setDiscount(1.5);
        
		session.execute(product);
		
		System.out.println("****");
		// 第一次 otherRule 不匹配 , 更新完discount 后 ,重新触发 otherRule 执行 
        product.setDiscount(0.5);
		session.execute(product);




当第一个规则执行update方法之后,规则otherRule也会被触发执行。
注释掉update方法,规则otherRule则不会被触发。

lock-on-active true 可以控制当前的规则只会被执行一次,
一个规则的重复执行不一定是本身触发的,也可能是其他规则触发的,这个是no-loop的加强版


例子2 完整代码

https://gitee.com/dyyx/droolsdemo/blob/master/src/main/java/dyyx/drools/demo2/Demo2Main.java

上一篇     下一篇
基本的社交礼仪

Cookie Session 和 Token

Timer already cancelled 异常分析

redis单线程为什么还那么快

redis的VM机制

rocketmq知识点