`
dingjob
  • 浏览: 183646 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

规则引擎 Drools 使用解析

阅读更多

   Drools 5 采用了原生的规则语言,那是一种非 XML 文本格式。在符号方面,这种格式是非常轻量的,它的应用非常简单。可以适用于比较复杂的业务逻辑,本例是用于计费系统的批价,粗略来说,有按次收费,按月收费,按照流量收费,又根据前提不同,使用不同的优惠策略,比如购买了某产品赠送800通话实践100分钟,又有可能根据当月实际使用天数赠送一定的通话时长。如此复杂场景使用规则引擎再好不过了,将动态的都用规则标识,模型里只存有静态数据。

  首先Drools 规则要卸载drl 的文件里,通过程序加载这个drl,然后才可以运算

 

  1. 引入jar包(maven 编译)

 

  <dependency>
      <groupId>org.drools</groupId>
      <artifactId>drools-core</artifactId>
      <version>5.0.1</version>
    </dependency>
    <dependency>
      <groupId>org.drools</groupId>
      <artifactId>drools-compiler</artifactId>
      <version>5.0.1</version>
    </dependency>

 2. 包装下drools

 

 

public class RuleRunner {
	
	public RuleRunner() {
    }
	private static final String RULES_FILE="rules/charge.drl";
	
	    public void runRules(Object[] facts){

	        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
	        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
	        System.out.println( "Loading file: " + RULES_FILE );
	        kbuilder.add( ResourceFactory.newClassPathResource( RULES_FILE,RuleRunner.class ),ResourceType.DRL );
	        if (kbuilder.hasErrors() ) {
	            throw new ServiceException("charge.drl is a invalid rule file!");
	        }
	        Collection<KnowledgePackage> pkgs = kbuilder.getKnowledgePackages();
	        kbase.addKnowledgePackages( pkgs );
	        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();
	    }
	}

 

 3. 调用这个封装进行异步的规则处理

 

 

 

 

 

 

 

Object[] facts={chargeRulesModel,chargePriceResult};
        new RuleRunner().runRules(facts);

 

 

 facts 就是要传入传出的对象。

 

  4. 一个规则的解析

#created on: 2010-4-26
package charge

#list any import classes here.
import java.math.BigDecimal;

rule "rule_800yz:be707 -2" #800月租费优惠 规则头注释
	when   #条件
		$chargeModel : ChargeRulesModel($pricePlan:pricePlan,$featureList:featureList,eval($pricePlan.getPricePlanMain().getRuleCode().equals("rule_800yz")),eval(String.valueOf($featureList.get("pp900_1000")).equals("10Express")))
		$chargeResult : ChargePriceResult()
	then    # 执行逻辑
	double price=$pricePlan.getCyclePolicy().getPrice();
	  int usage=(Integer)($featureList.get("pp900_61"));
	  int accountLength=(Integer)($featureList.get("pp900_59"));
	  int totalAccount=(Integer)($featureList.get("pp900_88"));
	  int preferValue= Integer.parseInt($pricePlan.getPreferentialPolicy().getPreferentValue());
	  ##总使用量-赠送量>账期     则取账期的使用量作为使用天数
	  if(totalAccount- preferValue>= accountLength){ #使用类似java语言的判断逻辑
	  	usage=  accountLength;
	  }else{
	  	usage = totalAccount- preferValue;
	  }
	  BigDecimal result=  new BigDecimal(price*usage/accountLength);
	  $chargeResult.setAmount(result);
	  System.out.println("800月租费优惠");
end

 主要包含注释,条件,要执行的业务,还可以写方法-也就相当于helper类,实际运行时会转化为java类,但是不建议这么写,你完全可以另外写个java类,这里调用就可以了。

 

    到这里就可以完成你的drools 应用了,具体原理下回分解

分享到:
评论
20 楼 菜鸟学生会 2018-01-17  
Drools规则工作流引擎开发教程
网盘地址:http://pan.baidu.com/s/1boavEAN 密码:q4e0
备用地址(腾讯微云):http://url.cn/5NZUh5b 密码:rhO85Y
19 楼 di1984HIT 2014-09-06  
谢谢你,如果Drools都是这种程序逻辑的话,我觉得还不如用脚本语言来做,一样满足。
18 楼 windhello 2011-03-02  
后面一段的代码怎么这么长?
现在用drools对于数据类型可以自动转换了吧,不用写这么长来进行数据转换
17 楼 lkf520java 2011-02-22  
ltian 写道
我对规则引擎的理念也很感兴趣,但是联想到实际的工作场景,我发现Drools并没有想象中的完美,以下疑问请教众位大侠:

1.规则里面很多的判据不是直接就具备的,需要一些整理过程,那么这些整理过程到底是在Java类里面做还是在Drools规则里面做?举例子说:
规则如下:
如果用户购买的商品中有两个以上的A产品和一个B产品就打85折。
如果用户购买的商品中有两个以上的B产品,就打8折。

在实际开发中,我们会把用户准备购买的产品都放在一个列表中。
如果要应用规则引擎,直接以产品列表为“事实”是最理想的,但是以直接以产品列表为“事实”就需要在规则中插入Java代码,用来整理出产品A和产品B的数量。这样一来,整理产品列表的Java代码就脱离了Java的运行环境,调试起来比较困难。至于更复杂的一些业务规则,用Rule去实现岂不是很难阅读和理解?

如果我们不直接以产品列表为"事实",而已采购的产品A和B的数量为事实,那么在调用规则之前,就要在Java中整理产品列表,求出产品A和B的数量,然后将其作为“事实”调用规则。此种方案的缺点就是不够灵活。一旦规则变化了,需要纳入产品C的数量来作为打折的依据,那么既要修改Java中整理产品列表的代码,又要修改规则文件。这也是我们不愿意看到的场面!

2.所谓的“业务规则”和“业务逻辑”区别到底在哪?是不是所有业务逻辑都可以看做是“业务规则”?如果是这样,那么复杂的业务逻辑或者说复杂的业务规则用规则文件去编写是否合适?如何把握将哪些业务规则用规则引擎去实现的度?


3. 如果要推入工作内存的事实量较大,或者需要用到的规则量较大,规则引擎的性能可否满足要求呢?

4. “部门经理(角色)能够批准2天以内的请假,总经理(角色)可以批准2天以上的请假”,这样的规则算不算业务规则?这样的规则中,什么是事实,什么是结论?在工作流的场景下,我期望的是给出申请的请假天数,然后根据业务规则找出可以批准的角色,然后将工作任务发给该角色。那么规则引擎是否具有这样类似的查询功能呢?或者我该如何去实现?


这位仁兄关心的问题,也正是我关心的问题.希望大侠能够给出好的方案和建议.
16 楼 gxb_1985 2010-06-18  
怎么还在drl中写if else啊
这个可以写在function中
15 楼 qyhdt 2010-05-28  
说实话,很想熟悉,但是不会
14 楼 sandy320 2010-05-28  
规则drl文件中可以应用HTML的页面元素?

还是只能用Java 相关的啊
13 楼 andyivy6 2010-05-10  
在rhs中还用if else啊?
12 楼 felixshao 2010-05-09  
ltian 写道
我对规则引擎的理念也很感兴趣,但是联想到实际的工作场景,我发现Drools并没有想象中的完美,以下疑问请教众位大侠:

1.规则里面很多的判据不是直接就具备的,需要一些整理过程,那么这些整理过程到底是在Java类里面做还是在Drools规则里面做?举例子说:
规则如下:
如果用户购买的商品中有两个以上的A产品和一个B产品就打85折。
如果用户购买的商品中有两个以上的B产品,就打8折。

在实际开发中,我们会把用户准备购买的产品都放在一个列表中。
如果要应用规则引擎,直接以产品列表为“事实”是最理想的,但是以直接以产品列表为“事实”就需要在规则中插入Java代码,用来整理出产品A和产品B的数量。这样一来,整理产品列表的Java代码就脱离了Java的运行环境,调试起来比较困难。至于更复杂的一些业务规则,用Rule去实现岂不是很难阅读和理解?

如果我们不直接以产品列表为"事实",而已采购的产品A和B的数量为事实,那么在调用规则之前,就要在Java中整理产品列表,求出产品A和B的数量,然后将其作为“事实”调用规则。此种方案的缺点就是不够灵活。一旦规则变化了,需要纳入产品C的数量来作为打折的依据,那么既要修改Java中整理产品列表的代码,又要修改规则文件。这也是我们不愿意看到的场面!

没有用过Drools,但前公司(刚失业)用得很多(自己开发的商业规则引擎)。 我先讲一下它有的功能。
1.  规则引擎 理论上是给BA用的, 而不是给开发人员用的。(现实是BA基本上复杂一点的规则就写不出来了,但开发人员写的Rules BA必须能看懂。)
2.规则引擎能接受输入。我们的系统实现是:
建立一个巨大无比的树Domain Object, 里面有所有的信息。每一条Rules By Default 都有Access到Domain Object。
提供图形化的Column Picker。 应该说规则引擎跟你的Data Model是紧紧的结合在一起的。
Rule 应该有steps。前一个Step的值可以传到下一个Step。提供API调用Java。提供Rule 的调试工具。


2.所谓的“业务规则”和“业务逻辑”区别到底在哪?是不是所有业务逻辑都可以看做是“业务规则”?如果是这样,那么复杂的业务逻辑或者说复杂的业务规则用规则文件去编写是否合适?如何把握将哪些业务规则用规则引擎去实现的度?

基本上大部分的业务逻辑都可以看做是“业务规则”。其实越复杂的业务逻辑越应该用用规则文件去编写,(前提)因为BA是可以看得懂Rule的,如果我们把业务逻辑放到Java里面,只能通过测试才知道是否符合要求,但复杂的业务逻辑有很多时候很多地方Test Case 没有Cover。

3. 如果要推入工作内存的事实量较大,或者需要用到的规则量较大,规则引擎的性能可否满足要求呢?
取决于规则引擎的实现方式。

4. “部门经理(角色)能够批准2天以内的请假,总经理(角色)可以批准2天以上的请假”,这样的规则算不算业务规则?这样的规则中,什么是事实,什么是结论?在工作流的场景下,我期望的是给出申请的请假天数,然后根据业务规则找出可以批准的角色,然后将工作任务发给该角色。那么规则引擎是否具有这样类似的查询功能呢?或者我该如何去实现?

肯定算业务规则。不过你的例子不是很完善, 例如部门经理不应该能够批准自己的请假,所有给出申请的请假天数,然后根据业务规则找出可以批准的角色不是很合理。
应该是:定义好员工之间的关系。每一个员工根据不同的请求都有一个default NextAppover(当default NextAppover 请假了或者出差了怎么办太复杂了,讲不完)。default NextAppover 是根据条件不同而不同的。例如你要请假,你的default NextAppover 是谁,或者你要审批某一样东西default NextAppover 是不同的。所以default NextAppover本身应该由Rule决定。决定了NextAppover,再根据user请假的天数决定NextAppover是否有权批准,如果没有,通常由NextAppover决定下一步怎么办,通常是Pass 到他自己的NextAppover。 在你的例子中,假如是普通员工请假三天,你是否想直接找到总经理,然后把工作任务发给总经理而部门经理不知道呢?更复杂一点的例子是:如果你要请假,哪些人你是要CC的。
一些使用规则引擎必须要注意的问题:
那些Rule需要Versioning, 就是说不同的时间用不同Rule。哪些不要。
Rule 的命名和查找?
Rule 如何能够重复使用?(把十条Rule的逻辑放到一条里可能比Java Extract 一个方法难很多)。




11 楼 dingjob 2010-05-09  
ltian 写道
我对规则引擎的理念也很感兴趣,但是联想到实际的工作场景,我发现Drools并没有想象中的完美,以下疑问请教众位大侠:

1.规则里面很多的判据不是直接就具备的,需要一些整理过程,那么这些整理过程到底是在Java类里面做还是在Drools规则里面做?举例子说:
规则如下:
如果用户购买的商品中有两个以上的A产品和一个B产品就打85折。
如果用户购买的商品中有两个以上的B产品,就打8折。

在实际开发中,我们会把用户准备购买的产品都放在一个列表中。
如果要应用规则引擎,直接以产品列表为“事实”是最理想的,但是以直接以产品列表为“事实”就需要在规则中插入Java代码,用来整理出产品A和产品B的数量。这样一来,整理产品列表的Java代码就脱离了Java的运行环境,调试起来比较困难。至于更复杂的一些业务规则,用Rule去实现岂不是很难阅读和理解?

如果我们不直接以产品列表为"事实",而已采购的产品A和B的数量为事实,那么在调用规则之前,就要在Java中整理产品列表,求出产品A和B的数量,然后将其作为“事实”调用规则。此种方案的缺点就是不够灵活。一旦规则变化了,需要纳入产品C的数量来作为打折的依据,那么既要修改Java中整理产品列表的代码,又要修改规则文件。这也是我们不愿意看到的场面!


2.所谓的“业务规则”和“业务逻辑”区别到底在哪?是不是所有业务逻辑都可以看做是“业务规则”?如果是这样,那么复杂的业务逻辑或者说复杂的业务规则用规则文件去编写是否合适?如何把握将哪些业务规则用规则引擎去实现的度?

对于这个问题,我认为,规则是可以动态加载的,在线上环境下更新,不需要停应用的,建议尽量放在规则里面,还有现在都有eclipse插件支持调试的,对于简单的计算应该还是方便的。如果是很复杂的业务逻辑,或者要组装一个很复杂的对象,肯定要放在java处理比较好。

ltian 写道

3. 如果要推入工作内存的事实量较大,或者需要用到的规则量较大,规则引擎的性能可否满足要求呢?

使用规则引擎对于不是用户访问web应用的情况,最好是异步的,规则量太大则需要使用缓存。

ltian 写道


4. “部门经理(角色)能够批准2天以内的请假,总经理(角色)可以批准2天以上的请假”,这样的规则算不算业务规则?这样的规则中,什么是事实,什么是结论?在工作流的场景下,我期望的是给出申请的请假天数,然后根据业务规则找出可以批准的角色,然后将工作任务发给该角色。那么规则引擎是否具有这样类似的查询功能呢?或者我该如何去实现?


这个显然不是规则引擎擅长的领域,就像OGNL同样可以解析规则,但是很难定义出来规则。这种就用工作流来做吧 

你描述问题很清晰,哈哈 学习。
10 楼 dingjob 2010-05-09  
elvishehai 写道
看了之后还是不明白了。呵呵,


其实我写的有些大意,我的基本目的不是如何写规则,而是能够用起来规则引擎,规则应该写简单点,我从代码里copy了一段比较复杂的规则。
9 楼 turionboy 2010-05-07  
不知道这家伙是做什么地,插不上嘴呀
8 楼 ltian 2010-05-07  
这么好的探讨主题,怎么没人感兴趣吗?
7 楼 ltian 2010-05-07  
我对规则引擎的理念也很感兴趣,但是联想到实际的工作场景,我发现Drools并没有想象中的完美,以下疑问请教众位大侠:

1.规则里面很多的判据不是直接就具备的,需要一些整理过程,那么这些整理过程到底是在Java类里面做还是在Drools规则里面做?举例子说:
规则如下:
如果用户购买的商品中有两个以上的A产品和一个B产品就打85折。
如果用户购买的商品中有两个以上的B产品,就打8折。

在实际开发中,我们会把用户准备购买的产品都放在一个列表中。
如果要应用规则引擎,直接以产品列表为“事实”是最理想的,但是以直接以产品列表为“事实”就需要在规则中插入Java代码,用来整理出产品A和产品B的数量。这样一来,整理产品列表的Java代码就脱离了Java的运行环境,调试起来比较困难。至于更复杂的一些业务规则,用Rule去实现岂不是很难阅读和理解?

如果我们不直接以产品列表为"事实",而已采购的产品A和B的数量为事实,那么在调用规则之前,就要在Java中整理产品列表,求出产品A和B的数量,然后将其作为“事实”调用规则。此种方案的缺点就是不够灵活。一旦规则变化了,需要纳入产品C的数量来作为打折的依据,那么既要修改Java中整理产品列表的代码,又要修改规则文件。这也是我们不愿意看到的场面!

2.所谓的“业务规则”和“业务逻辑”区别到底在哪?是不是所有业务逻辑都可以看做是“业务规则”?如果是这样,那么复杂的业务逻辑或者说复杂的业务规则用规则文件去编写是否合适?如何把握将哪些业务规则用规则引擎去实现的度?


3. 如果要推入工作内存的事实量较大,或者需要用到的规则量较大,规则引擎的性能可否满足要求呢?

4. “部门经理(角色)能够批准2天以内的请假,总经理(角色)可以批准2天以上的请假”,这样的规则算不算业务规则?这样的规则中,什么是事实,什么是结论?在工作流的场景下,我期望的是给出申请的请假天数,然后根据业务规则找出可以批准的角色,然后将工作任务发给该角色。那么规则引擎是否具有这样类似的查询功能呢?或者我该如何去实现?

6 楼 ziyu_1 2010-05-07  
都不知道是什么, 最后那一堆代码看得蛋疼
5 楼 董瑞龙 2010-05-07  
正在使用drools期待更多交流
4 楼 coffeesweet 2010-05-07  
用过drolls,但总是一知半解,感觉不太符合JAVA程序编写习惯,总觉得很别扭!
3 楼 mooninday 2010-05-07  
以前用drools,在drl文件里加了很多function,写起来超难受。。。
2 楼 elvishehai 2010-05-06  
看了之后还是不明白了。呵呵,
1 楼 hongliangpan 2010-05-06  
Drools规则引擎介绍.ppt

什么是规则引擎?
Drools规则引擎介绍
信用卡申请实例介绍
Drools实现信用卡申请规则
编写客户端测试信用卡申请规则

相关推荐

    规则引擎Drools使用手册(中文)

    ### 规则引擎Drools使用手册:4.0版更新要点详解 #### 一、Drools 4.0新特性概览 Drools 4.0是一次重要的更新,相较于之前的Drools 3.0.x系列,在语言表达、引擎性能以及工具实用性等方面都有显著提升。以下为此次...

    Drools规则引擎从入门到精通源码

    从基础讲起,结合应用场景,由浅到深细化讲解drools规则引擎的的相关知识,并结合具体实例,演示功能的使用和注意事项。后面通过搭建具体的项目并结合springboot框架联合使用Drools的相关知识包括决策表的使用,囊括...

    规则引擎Drools 之 springboot 集成、热加载

     如果对drools还不是特别熟悉的,可以看下 《规则引擎Drools 之 初识drools》这篇文章;  本文源码,github 传送门:https://github.com/vincent9309/drools:  系统架构如下: 二、项目目录结构 三、...

    规则引擎Drools在J2EE项目开发中的应用

    为了更好地理解和应用Drools,你可以阅读“规则引擎Drools在J2EE项目开发中的应用.pdf”这份文档,它将详细讲解如何在实际项目中集成和使用Drools,包括规则的编写、引擎的配置、以及与J2EE环境的交互等内容。...

    规则引擎Drools 中文使用指南

    ### 规则引擎Drools 中文使用指南 #### 一、Drools简介与特点 Drools是一个开源业务规则管理系统(BRMS),最初由Codehaus发起并维护,后来被JBoss收购并更名为JBoss Rules。Drools旨在提供一个易于访问、调整和...

    Java规则引擎---Drools的介绍及应用

    ### Java规则引擎——Drools的深度解析与应用探索 #### 一、规则引擎与基于规则的专家系统 规则引擎,作为软件开发领域的一项关键技术,其核心在于模仿人类的决策过程,通过预定义的规则集对输入数据进行分析,...

    drools入门(二)-----规则引擎Drools解决汽水问题

    规则引擎是一种软件系统,它解析并执行预先定义好的业务规则,这些规则可以是复杂的条件语句或决策逻辑。在汽水问题的场景中,我们可能会遇到如下的规则: 1. **如果客户购买两瓶汽水,可以享受9折优惠。** 2. **...

    drools从字符串中动态加载规则

    在使用Drools规则引擎时,有时我们需要实现更加灵活的规则管理方式。例如,在开发过程中,我们可能希望不通过每次修改代码或重启服务来更新业务规则,而是能够在运行时动态地更改规则。本文将详细介绍如何在Drools中...

    规则引擎drools与spring整合

    1. **Rule Engine(规则引擎)**:负责解析、编译和执行业务规则。 2. **Knowledge Base(知识库)**:存储和管理所有的规则。 3. **Working Memory(工作内存)**:存放事实对象,规则引擎根据这些对象来触发规则。...

    Drools_规则引擎详解

    Drools 规则引擎详解 Drools 规则引擎是基于 Java 的开源规则引擎,由 JBoss 发布。作为一个业务规则管理系统(BRMS),Drools 提供了一个基于规则的系统,用于定义、执行和管理业务规则。Drools 的主要功能是将...

    Drools规则引擎样例系统

    《Drools规则引擎样例系统深度解析》 Drools,这个强大的开源规则引擎,是Java领域中用于实现业务规则管理和决策逻辑的核心工具。它以其高效、灵活和可扩展的特性,在各种复杂的业务场景中得到了广泛应用。在这个名...

    Drools5规则引擎开发教程

    《Drools5规则引擎开发教程》是一本深入解析Drools规则引擎的实用指南,旨在帮助开发者理解和掌握如何在实际项目中应用规则引擎技术。Drools是Java平台上的一个开源规则引擎,它允许开发者以声明式的方式编写业务...

    从Drools规则引擎到风控反洗钱系统v0.3.2.pdf

    这些内容覆盖了规则引擎的基础知识、Drools规则引擎的特点和使用方法、以及与Spring Boot的集成示例。文档的持续更新表明了作者致力于持续提供最新的信息和帮助,满足读者在Drools及风控反洗钱系统应用方面的需求。

    规则引擎drools讲义,讲解与实例demo

    【 Drools 规则引擎详解及实例演示】 Drools 是一个开源的、基于Java的规则引擎,它允许开发者以声明式的方式编写业务规则。在上述的信用卡申请业务场景中,Drools 可以非常有效地处理复杂的业务逻辑,替代传统的 ...

    Drools5规则引擎开发教程.pdf

    《Drools5规则引擎开发教程》是一本深入解析Drools5这一强大规则引擎的指导书籍。Drools5是JBOSS公司推出的一款开源业务规则管理系统(BRMS),它基于Java语言,旨在帮助开发者将业务逻辑从应用程序中分离出来,实现...

    Drools5规则引擎开发教程.rar

    通过阅读"Drools5规则引擎开发教程.pdf",你将了解如何配置和使用Drools5,以及如何利用其强大功能解决实际业务问题。学习Drools5不仅有助于提升你的业务逻辑处理能力,还能帮助你更好地实现业务规则的管理和维护。

    Drools开发最全中文版技术指南

    《Drools开发最全中文版技术指南》是一份针对Java开发者的重要参考资料,它全面讲解了如何使用Drools这一强大的规则引擎进行业务逻辑的构建和管理。Drools是Red Hat公司推出的一个开源规则引擎,它基于Java,支持...

    规则引擎drools

    **标题:“规则引擎drools”** 规则引擎Drools是一种强大的、开源的Java决策管理引擎,它基于业务规则管理系统(BRMS)的概念,允许开发者将业务逻辑编码为一系列可执行的规则。Drools的核心是基于Rete算法的推理...

    Drools5.x 规则引擎开发教程

    Drools5.x 是一款基于 Java 的开源规则引擎,它允许开发者在业务逻辑层中使用基于规则的编程方法来构建灵活、可管理的业务规则。规则引擎作为一种软件组件,专门用于根据一组定义好的规则来处理业务逻辑。Drools5.x ...

    java规则引擎 -- Drools

    Java规则引擎Drools是一种强大的业务规则管理系统,它允许开发者将复杂的业务逻辑以规则的形式分离出来,便于管理和维护。Drools是基于Model Driven Architecture(MDA)的,它支持RuleML和Business Rule Markup ...

Global site tag (gtag.js) - Google Analytics