`
AngelAndAngel
  • 浏览: 234716 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

drools实现自定义业务规则

 
阅读更多
   最近做财务相关的积分规则,由于这个功能以后涉及到方方面面,所以想尽可能做的可维护,可扩展,平台其他人调用起来更加方便,联想到财务相关的功能会更多的规则配置,在这里打算用drools规则引擎来实现。
   规则引擎说起来比较简单,当你的功能有很多未知条件需要判断或需要遵循很多业务规则时,就可以采用。
   首先看看规则文件大大致样子,
  
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规则引擎JBOSS RULES(DROOLS 6.5) 动态规则

    JAVA规则引擎JBOSS RULES,也被称为DROOLS,是一种强大的业务规则管理系统,它允许开发者用自然语言来编写业务规则,并在运行时执行这些规则。DROOLS 6.5是该规则引擎的一个版本,提供了许多改进和新特性,以提高...

    Drools规则引擎从入门到精通

    Drools是一个强大的业务规则管理系统,它提供了业务规则引擎、Web创作工具(Drools Workbench)以及决策模型符号(DMN)的支持。作为一个开源项目,Drools使用Java编写,遵循Apache License 2.0,允许灵活管理和执行...

    Drools5规则引擎学习研究

    总的来说,Drools5为Java开发者提供了一个强大而灵活的规则引擎,可以方便地集成到各类业务系统中,实现业务规则的动态管理和执行。通过深入学习和实践,开发者能够更好地理解和运用Drools,提高业务系统的可维护性...

    Drools 规则引擎的介绍及应用

    Drools支持多种规则引擎标准,包括Rete算法和Drools Query Language (DRL),使得开发者能够轻松创建和管理复杂的业务规则。Drools不仅仅是一个简单的规则引擎,它还提供了完整的生命周期管理工具,帮助企业更好地...

    Drools5规则引擎开发教程.rar

    Drools5是一款强大的业务规则管理系统,它基于Java平台,为开发者提供了灵活的规则定义、存储、管理和执行的能力。...学习Drools5不仅有助于提升你的业务逻辑处理能力,还能帮助你更好地实现业务规则的管理和维护。

    基于Drools的规则引擎实例(完整、可运行eclipse工程)

    Drools是一款强大的业务规则管理系统,它基于Java语言,遵循BRMS(Business Rule Management System)标准,为开发者提供了一种高效、灵活的方式来管理和执行业务规则。在这个"基于Drools的规则引擎实例"中,我们...

    Drools规则引擎小结

    Drools是一款强大的规则引擎,源自Java领域,用于在应用程序中实现业务规则的管理和执行。它使得业务逻辑可以通过声明式的方式定义,而无需编写大量复杂的程序代码,从而提高开发效率和业务规则的可维护性。Drools的...

    Drools 规则语言和域语言实例

    Drools 是一个开源的业务规则管理系统(BRMS),它基于Java平台,提供了一种高效、灵活的方式来管理和执行业务规则。这个" Drools 规则语言和域语言实例"是针对初学者的一个入门教程,旨在帮助理解Drools如何通过...

    drools的简单入门案例.doc

    总结来说,drools 提供了一种高效且灵活的方式来管理业务规则,使得规则的修改与软件的其他部分解耦,降低了维护成本。通过编写 DRL 文件,我们可以将复杂的业务逻辑以易于理解和维护的规则形式表达,从而简化代码并...

    mapreduce与drools整合代码

    总的来说,MapReduce与Drools的整合为大数据分析提供了更强大的业务规则处理能力,使数据分析不仅限于简单的统计和聚合,还能根据业务需求进行复杂决策,从而在大数据场景下实现更加智能的业务逻辑。这样的整合对于...

    drools 语法教程

    Drools 语法教程 Drools 语法是一种基于规则的引擎,用于 business logic 的自动化处理。Drools 语法教程旨在为... Drools 提供了多种 API 用于规则的编译、收集和执行,帮助开发者快速实现业务逻辑的自动化处理。

    Java实现轻量级的业务规则管理系统

    本文将深入探讨如何使用Java语言实现一个轻量级的业务规则管理系统。这个系统可以帮助企业快速响应变化,将业务逻辑从复杂的代码中解耦出来,使得非程序员也能理解和调整业务规则。 首先,我们要理解业务规则的基本...

    drools calendar 使用demo

    drools 是一个强大的规则引擎,它允许开发人员以声明式的方式定义业务规则和流程。而drools calendar 是 drools 提供的一个特性,用于在规则执行中引入时间相关的约束,例如调度、事件触发等。这个“drools calendar...

    Drools4Demo 示例 非常不错

    通过研究和理解Drools4Demo中的各个示例,开发者可以快速掌握Drools的用法,并将其应用于自己的业务场景,实现高效、灵活的业务规则管理。此外,Drools4Demo还提供了详细的文档和注释,帮助开发者更好地理解和学习...

    基于Drools规则引擎的实例

    Drools是一款强大的业务规则管理系统,它基于Java语言,主要用于实现复杂的业务逻辑和决策。Drools的核心是它的规则引擎,它能够执行基于事实的推理,允许开发者编写一系列的规则来控制应用程序的行为。在本实例中,...

    规则引擎drools在eclipse安装详解

    Drools 是一款强大的规则引擎,它允许开发者在 Java 应用程序中嵌入业务规则,从而实现灵活的业务逻辑管理。下面将详细介绍如何在 Eclipse 开发环境中安装 Drools。 1. **下载 Drools** 首先,你需要访问 Drools ...

    java规则引擎 -- Drools

    Java规则引擎Drools是一个强大的业务规则管理系统,它允许开发者将业务规则从应用程序代码中分离出来,使得规则的管理和更新变得更加灵活和方便。Drools是基于规则推理的开源框架,它遵循BRMS(Business Rule ...

Global site tag (gtag.js) - Google Analytics