- 浏览: 234716 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
清林小篆:
引用[/col[size=xx-small][/size]or ...
tomcat ssl配置以及CAS单点登录探究 -
cyxy99:
u012534143 写道我用同样的方法,同样的节点关系,为什 ...
PageRank算法java实现版本 -
cyxy99:
schaha123 写道楼主还有一个问题想请教一下,下面这2段 ...
PageRank算法java实现版本 -
njthnet:
Participle 和 IkParticiple 这2个类找 ...
贝叶斯文本分类 java实现 -
u012534143:
我用同样的方法,同样的节点关系,为什么的得到的结果与您不一样呢 ...
PageRank算法java实现版本
最近做财务相关的积分规则,由于这个功能以后涉及到方方面面,所以想尽可能做的可维护,可扩展,平台其他人调用起来更加方便,联想到财务相关的功能会更多的规则配置,在这里打算用drools规则引擎来实现。
规则引擎说起来比较简单,当你的功能有很多未知条件需要判断或需要遵循很多业务规则时,就可以采用。
首先看看规则文件大大致样子,
看起来比较像if else,但是切忌,我们应该用一个业务人员的视角而不是一个程序员的视角来看规则文件,否则你会进入很多误区。
当多个工作对象进入规则引擎时,它可以根据多个条件同时判断,并且执行不同的业务代码。
下面有个场景,看看如何把规则引擎应用其中。
假如现在有两组数据对象,分别是现金流数据和账户数据,我们需要根据某个账户在某段时间内的现金流动状况来给账户计算余额。
首先新建现金流对象,账户对象,时间查询对象,分别如下(省去getter setter)
我们的目的是根据传入的AccountPeriod对象和一系列CashFlow,Account对象来自动计算出每个Account对象的blance。
规则文件应该如下编写:
drl规则文件引入包的语句和java类似,重点在下面。
首先创建规则,名为“CREDIT”,when里面是条件,冒号是赋值,以便下文使用,"==" ">=" "<="等符号的使用都和java类似。所以这个条件的意思是:
当传入的对象里面有AccountPeriod(并赋值到$ap),并且存在账户信息(并把accountNo赋值到$accountNo),并且存在现金流信息(并符合各属性的值的匹配),那么执行余额的增加。
规则DEBITS的逻辑差不多。
编写引擎的编译及部署代码,如下
规则引擎相当于一个容器,我们需要通过一个管道跟这个容器连起来,这个管道就是会话,新建一个有状态的会话:
ksession 对象的insert方法可以把对象放入工作区(容器),让规则引擎来处理。下面新建几条测试数据:
至此,规则已全部启动,为了测试,打印这两个账户的余额信息:
结果为:
By 阿飞哥 转载请说明
腾讯微博:http://t.qq.com/duyunfeiRoom
新浪微博:http://weibo.com/u/1766094735
规则引擎说起来比较简单,当你的功能有很多未知条件需要判断或需要遵循很多业务规则时,就可以采用。
首先看看规则文件大大致样子,
rule "testDrools" when ...各种条件 then ...执行业务 end
看起来比较像if else,但是切忌,我们应该用一个业务人员的视角而不是一个程序员的视角来看规则文件,否则你会进入很多误区。
当多个工作对象进入规则引擎时,它可以根据多个条件同时判断,并且执行不同的业务代码。
下面有个场景,看看如何把规则引擎应用其中。
假如现在有两组数据对象,分别是现金流数据和账户数据,我们需要根据某个账户在某段时间内的现金流动状况来给账户计算余额。
首先新建现金流对象,账户对象,时间查询对象,分别如下(省去getter setter)
public class CashFlow { private Date date; private double amount; private String type; private long accountNo; } public class Account { private long accountNo; private double blance; } public class AccountPeriod { private Date start; private Date end; }
我们的目的是根据传入的AccountPeriod对象和一系列CashFlow,Account对象来自动计算出每个Account对象的blance。
规则文件应该如下编写:
package org.drools.examples.cashflow import org.drools.myTest.cashflow.Account; import org.drools.myTest.cashflow.AccountPeriod; import org.drools.myTest.cashflow.CashFlow; rule "CREDIT" when $ap:AccountPeriod() $acc:Account($accountNo:accountNo) CashFlow(type=="CREDIT",accountNo==$accountNo,date>=$ap.start && <=$ap.end,$amount:amount) then $acc.setBlance($acc.getBlance()+$amount); System.out.println("借入"); end rule "DEBITS" when $ap:AccountPeriod() $acc:Account($accountNo:accountNo) CashFlow(type=="DEBIT",accountNo==$accountNo,date>=$ap.start && <=$ap.end,$amount:amount) then $acc.setBlance($acc.getBlance()-$amount); System.out.println("借出"); end
drl规则文件引入包的语句和java类似,重点在下面。
首先创建规则,名为“CREDIT”,when里面是条件,冒号是赋值,以便下文使用,"==" ">=" "<="等符号的使用都和java类似。所以这个条件的意思是:
当传入的对象里面有AccountPeriod(并赋值到$ap),并且存在账户信息(并把accountNo赋值到$accountNo),并且存在现金流信息(并符合各属性的值的匹配),那么执行余额的增加。
规则DEBITS的逻辑差不多。
编写引擎的编译及部署代码,如下
// KnowledgeBuilder用来在业务代码中收集已经编写好的规则,然后对这些规则文件进行编译,最终产生 // 一批编译好的规则包(KnowledgePackage)给其他的应用程序使用 final KnowledgeBuilder kbuilder = KnowledgeBuilderFactory .newKnowledgeBuilder(); // 解析并且编译规则文件 kbuilder.add(ResourceFactory.newClassPathResource("cashflow.drl", CashFlowTestMain.class), ResourceType.DRL); // 打出错误 if (kbuilder.hasErrors()) { System.out.println(kbuilder.getErrors().toString()); throw new RuntimeException("Unable to compile \"cashflow.drl\"."); } // 得到编译后的包 final Collection<KnowledgePackage> pkgs = kbuilder .getKnowledgePackages(); // 部署到一个知识库 // KnowledgeBase是用来收集应用当中知识定义的知识库对象,在一个KnowledgeBase当中,可以包含普通的规则(rule) // 规则流(rule flow),函数定义(function),用户自定义对象(type model), final KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); kbase.addKnowledgePackages(pkgs);
规则引擎相当于一个容器,我们需要通过一个管道跟这个容器连起来,这个管道就是会话,新建一个有状态的会话:
//开启有状态会话 final StatefulKnowledgeSession ksession = kbase .newStatefulKnowledgeSession();
ksession 对象的insert方法可以把对象放入工作区(容器),让规则引擎来处理。下面新建几条测试数据:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); /** ******************第一条记录************************* */ CashFlow cf0 = new CashFlow(); String time0 = "2010-01-12"; cf0.setDate(sdf.parse(time0)); cf0.setAmount(100); cf0.setType("CREDIT"); cf0.setAccountNo(1); ksession.insert(cf0); CashFlow cf1 = new CashFlow(); String time1 = "2010-02-02"; cf1.setDate(sdf.parse(time1)); cf1.setAmount(200); cf1.setType("DEBIT"); cf1.setAccountNo(1); ksession.insert(cf1); CashFlow cf2 = new CashFlow(); String time2 = "2010-05-18"; cf2.setDate(sdf.parse(time2)); cf2.setAmount(50); cf2.setType("CREDIT"); cf2.setAccountNo(1); ksession.insert(cf2); CashFlow cf3 = new CashFlow(); String time3 = "2010-03-18"; cf3.setDate(sdf.parse(time3)); cf3.setAmount(75); cf3.setType("CREDIT"); cf3.setAccountNo(1); ksession.insert(cf3); Account acc = new Account(); acc.setAccountNo(1); acc.setBlance(0); ksession.insert(acc); /** ******************第二条记录************************* */ CashFlow cf0_else = new CashFlow(); String time0_else = "2010-01-12"; cf0_else.setDate(sdf.parse(time0_else)); cf0_else.setAmount(150); cf0_else.setType("CREDIT"); cf0_else.setAccountNo(2); ksession.insert(cf0_else); CashFlow cf1_else = new CashFlow(); String time1_else = "2010-02-02"; cf1_else.setDate(sdf.parse(time1_else)); cf1_else.setAmount(500); cf1_else.setType("DEBIT"); cf1_else.setAccountNo(2); ksession.insert(cf1_else); CashFlow cf2_else = new CashFlow(); String time2_else = "2010-05-18"; cf2_else.setDate(sdf.parse(time2_else)); cf2_else.setAmount(50); cf2_else.setType("CREDIT"); cf2_else.setAccountNo(2); ksession.insert(cf2_else); CashFlow cf3_else = new CashFlow(); String time3_else = "2010-03-18"; cf3_else.setDate(sdf.parse(time3_else)); cf3_else.setAmount(75); cf3_else.setType("CREDIT"); cf3_else.setAccountNo(2); ksession.insert(cf3_else); Account acc_else = new Account(); acc_else.setAccountNo(2); acc_else.setBlance(0); ksession.insert(acc_else); /* 查询条件 */ AccountPeriod ap = new AccountPeriod(); String start = "2009-05-06"; String end = "2012-02-25"; ap.setStart(sdf.parse(start)); ap.setEnd(sdf.parse(end)); ksession.insert(ap); // 触发所有规则执行 ksession.fireAllRules(); // 一定要释放 ksession.dispose();
至此,规则已全部启动,为了测试,打印这两个账户的余额信息:
System.out.println(acc.getAccountNo() + " : " + acc.getBlance()); System.out.println(acc_else.getAccountNo() + " : " + acc_else.getBlance());
结果为:
借出 借入 借入 借入 借出 借入 借入 借入 1 : 25.0 2 : -225.0
By 阿飞哥 转载请说明
腾讯微博:http://t.qq.com/duyunfeiRoom
新浪微博:http://weibo.com/u/1766094735
发表评论
-
招Java培训老师(还是论坛招人靠谱)
2015-05-10 13:39 556好久没来坛子了,一来就搞这么有目的的事儿。。。 好吧, ... -
动手开发自己的mvc-3----容器该帮我们做什么?(非常的重点)
2013-01-22 13:55 1824注解注入 我们知道,Spring只有一个角色:工厂。这个工厂可 ... -
动手开发自己的mvc-2----完善控制层,提供自动注入和注解上传等功能
2013-01-22 13:44 2586当表单提交的内容过多 ,让懒惰的程序员一个个getPara ... -
动手开发自己的mvc-1----实现初步的控制层,实现各种配置和资源获取
2013-01-22 13:28 2820mvc框架最基础的功能就是跳转,struts2支持注 ... -
动手开发自己的mvc (系列)
2013-01-22 14:08 1934到年尾了,整理了一下我Evernote藏的各种文档,打算把ys ... -
linux下安装配置svn服务
2013-01-21 17:12 2677今天在阿里云架了一个svn,打算放平时的代码片段,还是记下过程 ... -
整合了一个小的爬取流程框架
2013-01-08 13:04 1312弄了一个小的爬取流程框架,把之前工作中用到的一些小经验 ... -
Mahout各种推荐器的主要特点
2012-12-06 15:17 2992Mahout有很多推荐的实现,各有特点,在这里一并记录 ... -
怎样通过词频得到这个词频的排序?
2012-12-03 14:35 2070在大规模检索中,我们怎样通过已经的词频得到词频的排序 ... -
贝叶斯文本分类 java实现
2012-09-25 15:15 12688昨天实现了一个基于贝叶斯定理的的文本分类,贝叶斯定理假 ... -
假如现在路边看到一个黑人,他是非洲人的概率怎么算?
2012-08-30 12:49 129假如现在路边看到一个黑人,他是非洲人的概率怎么算? ... -
我常用的js组件,包含自动补全,js字典,table动态增减
2012-08-10 10:42 2232这几个是我自写的常用的js组件,包含自动补全,js字典,t ... -
前段时间做了一个小型的MVC
2012-07-20 13:23 0前端时间做了一个小型的MVC,麻雀虽小,五脏俱全,目前实现的功 ... -
聚类算法之MST算法 java实现版本
2012-07-17 14:20 2804在介绍最小生成树算法(MST)之前,简单说一下平均链接算 ... -
聚类算法之单链接算法java实现
2012-07-05 10:09 4308聚类算法中基于链接的算法大致有三种:单链接算法(s ... -
朴素贝叶斯分类器
2012-05-20 15:25 0NaiveBayes分类器的优点是能得到已知Y的条件下X的 ... -
PageRank算法java实现版本
2012-05-16 16:03 17471PageRank算法是Google的核心搜索算法,在所有 ... -
聚类算法之kmeans算法java版本
2012-04-22 21:34 20900聚类的意思很明确,物以类聚,把类似的事物放在一起。 ... -
昨天做了个小工具DB转pojo,html,sql
2012-03-21 13:15 1776做dbutils时为了方便就做了个小工具,省点小事儿吧。 -
我这儿的讨论(项目小组)区可以进来了
2012-02-28 10:38 150java项目小组群,前几天清了几个破坏气氛者,和不发言 ...
相关推荐
JAVA规则引擎JBOSS RULES,也被称为DROOLS,是一种强大的业务规则管理系统,它允许开发者用自然语言来编写业务规则,并在运行时执行这些规则。DROOLS 6.5是该规则引擎的一个版本,提供了许多改进和新特性,以提高...
Drools是一个强大的业务规则管理系统,它提供了业务规则引擎、Web创作工具(Drools Workbench)以及决策模型符号(DMN)的支持。作为一个开源项目,Drools使用Java编写,遵循Apache License 2.0,允许灵活管理和执行...
总的来说,Drools5为Java开发者提供了一个强大而灵活的规则引擎,可以方便地集成到各类业务系统中,实现业务规则的动态管理和执行。通过深入学习和实践,开发者能够更好地理解和运用Drools,提高业务系统的可维护性...
Drools支持多种规则引擎标准,包括Rete算法和Drools Query Language (DRL),使得开发者能够轻松创建和管理复杂的业务规则。Drools不仅仅是一个简单的规则引擎,它还提供了完整的生命周期管理工具,帮助企业更好地...
Drools5是一款强大的业务规则管理系统,它基于Java平台,为开发者提供了灵活的规则定义、存储、管理和执行的能力。...学习Drools5不仅有助于提升你的业务逻辑处理能力,还能帮助你更好地实现业务规则的管理和维护。
Drools是一款强大的业务规则管理系统,它基于Java语言,遵循BRMS(Business Rule Management System)标准,为开发者提供了一种高效、灵活的方式来管理和执行业务规则。在这个"基于Drools的规则引擎实例"中,我们...
Drools是一款强大的规则引擎,源自Java领域,用于在应用程序中实现业务规则的管理和执行。它使得业务逻辑可以通过声明式的方式定义,而无需编写大量复杂的程序代码,从而提高开发效率和业务规则的可维护性。Drools的...
Drools 是一个开源的业务规则管理系统(BRMS),它基于Java平台,提供了一种高效、灵活的方式来管理和执行业务规则。这个" Drools 规则语言和域语言实例"是针对初学者的一个入门教程,旨在帮助理解Drools如何通过...
总结来说,drools 提供了一种高效且灵活的方式来管理业务规则,使得规则的修改与软件的其他部分解耦,降低了维护成本。通过编写 DRL 文件,我们可以将复杂的业务逻辑以易于理解和维护的规则形式表达,从而简化代码并...
总的来说,MapReduce与Drools的整合为大数据分析提供了更强大的业务规则处理能力,使数据分析不仅限于简单的统计和聚合,还能根据业务需求进行复杂决策,从而在大数据场景下实现更加智能的业务逻辑。这样的整合对于...
Drools 语法教程 Drools 语法是一种基于规则的引擎,用于 business logic 的自动化处理。Drools 语法教程旨在为... Drools 提供了多种 API 用于规则的编译、收集和执行,帮助开发者快速实现业务逻辑的自动化处理。
本文将深入探讨如何使用Java语言实现一个轻量级的业务规则管理系统。这个系统可以帮助企业快速响应变化,将业务逻辑从复杂的代码中解耦出来,使得非程序员也能理解和调整业务规则。 首先,我们要理解业务规则的基本...
drools 是一个强大的规则引擎,它允许开发人员以声明式的方式定义业务规则和流程。而drools calendar 是 drools 提供的一个特性,用于在规则执行中引入时间相关的约束,例如调度、事件触发等。这个“drools calendar...
通过研究和理解Drools4Demo中的各个示例,开发者可以快速掌握Drools的用法,并将其应用于自己的业务场景,实现高效、灵活的业务规则管理。此外,Drools4Demo还提供了详细的文档和注释,帮助开发者更好地理解和学习...
Drools是一款强大的业务规则管理系统,它基于Java语言,主要用于实现复杂的业务逻辑和决策。Drools的核心是它的规则引擎,它能够执行基于事实的推理,允许开发者编写一系列的规则来控制应用程序的行为。在本实例中,...
Drools 是一款强大的规则引擎,它允许开发者在 Java 应用程序中嵌入业务规则,从而实现灵活的业务逻辑管理。下面将详细介绍如何在 Eclipse 开发环境中安装 Drools。 1. **下载 Drools** 首先,你需要访问 Drools ...
Java规则引擎Drools是一个强大的业务规则管理系统,它允许开发者将业务规则从应用程序代码中分离出来,使得规则的管理和更新变得更加灵活和方便。Drools是基于规则推理的开源框架,它遵循BRMS(Business Rule ...