赛迪网 > IT技术 Java > Java大图列表
  IT资讯搜索
 
IT产品搜索
[程序开发][网管世界][网络安全][数据库技术]
[操作系统][嘉宾聊天·在线访谈][活动集锦]
[精彩专题][Symantec专区][订阅IT技术周刊]
[开发论坛][网管论坛][安全论坛][数据库论坛]
[操作系统论坛][Sybase专区][IBM dW技术专区]
[病毒求助][病毒与漏洞播报][文档·源码下载]

规则引擎实现探讨

发布时间:2007.11.01 09:44     来源:赛迪网技术社区    作者:baocl

系统要求实现类似如下规则:


代码
积分规则:凭XX信用卡消费1元人民币,即可获得1分的消费积分,  
在汽车类商户每消费100元人民币积8分,在房地产类商户每消费100元人民币积6分。  
兑奖规则:100分~300分:兑换150元礼品,300分~500分兑换300元礼品,  
500分以上兑换400元礼品 

 

因为系统中有大量类似这样的规则,而且规则会经常变动,另外业务上也要求这样的规则最好能由业务人员自己定义和修改,因此一个很自然的考虑是使用规则引擎来实现。

二、现有规则引擎产品分析
最初希望使用商业或开源的规则引擎,但从网上搜索的关于规则引擎的资料来看,现有规则引擎实现这样的应用好象不太合适。

1、如何定义规则?
一般规则引擎中定义规则的方式如下:


代码
if {  
    规则  
}  
then {  
    动作  


但这样的规则“消费1元人民币积1分”使用if...then...该如何定义呢?好象没法定义。

另外感觉这类规则定义就是一系列的if...then...这其中的逻辑和我们在java中的逻辑没有什么区别,
只是换了一种形式而已。这样的规则根本没办法给业务人员使用。

2、如何处理数据库与规则引擎的关系?
再者规则引擎是基于事实进行推演,所以在触发规则引擎计算之前,需要先装入事实。基于JSR94的实现
多使用OO的方式,例如:


代码
loadRules(); // 装入规则  
WorkingMemory workingMemory = businessRules.newWorkingMemory();  
workingMemory.addEventListener(new DebugWorkingMemoryEventListener());  
workingMemory.assertObject(student); // 装入事实  
workingMemory.fireAllRules(filter); // 触发计算 


摘自http://www.blogchinese.com/06042/201878/archives/2006/200652418217.shtml

这里就有一个问题,如果我的事实是基于数据库记录,那么该如何装入事实?因为规则的定义中条件部分
一般是基于对象的属性,动作部分一般是基于对象的方法,所以如果事实能使用数据记录,那么条件特别是
动作该如何定义?

3、需要Rete算法吗?
只要对规则引擎稍有接触,应该都听说过“Rete算法”,现有的商业或开源的规则引擎多是基于该算法。多数会解决
这样一个问题,就是自动处理动作对事实的反馈,如果一个动作影响了事实,那么会重新针对事实过滤规则,我想这样的反馈
计算可能大大影响了规则引擎的性能,而正Rete算法解决了规则引擎的性能问题。但上述规则并不需要这样的特性,所以性能问题不会表现在这些方面。

因为对这类商业和开源的规则只是有一个泛泛的了解,不知其能否解决这些问题?怎样解决这些问题?

三、方案
终合上述考虑,决定自己实现规则引擎,首要的就是将上述语句表示为规则引擎能识别的规则,自然需要一套语法来定义这样的规则,
结合实现及面向业务人员这样的需求,大略将上述语句转换为如下规则定义:


代码
客户积分 += POS消费总额(商户类型!=汽车类|房地产类) {主体=XX信用卡客户}   
客户积分 += POS消费总额(商户类型=汽车类)/ 100 * 6 {主体=XX信用卡客户}   
客户积分 += POS消费总额(商户类型=房地产类)/ 100 * 8 {主体=XX信用卡客户}   
客户积分 -= 如果(兑换奖品总额>=400,500) {主体=XX信用卡客户,扣减规则=(消费类型=退货)}   
客户积分 -= 如果(兑换奖品总额>=300,300) {主体=XX信用卡客户,扣减规则=(消费类型=退货)}   
客户积分 -= 如果(兑换奖品总额>=150,100) {主体=XX信用卡客户,扣减规则=(消费类型=退货)}   


个人感觉如果能这样定义规则的话业务人员应该很容易就能看懂,也能很容易修改。

针对上述实现,我提出以下要求:


代码
语法简单,业务人员很容易明白  
必须支持中文规则定义  
必须支持自定函数(我想象的"POS消费总额","如果"都是函数)  
很容易扩展函数  
最好=,>,<之类的符号可以支持全角字符 


四、实现
现在考虑如果要用程序实现上述规则,有以下两种方案:
1、使用动态脚本语言实现规则解析,如ruby, groovy,jaskell之类的(好象这就叫DSL吧),但
不知能不能满足我上面提出的要求。
2、使用javacc,antlr定义语法生成解析器。

第二种方案的好处是灵活性足够强,而且能满足“中文定义”的要求,但要权衡,维护和调试一个解析器也不是一件轻松的事。


[ 发表评论 ] 字体[  ] [ 打印 ] [ 进入博客 ] [ 进入论坛 ]  [ 推荐给朋友 ]
  相关文章
· JAVA基础:实现HTMLEncode功能的bean (10-31) · Java进阶:优化Entity Beans的七条守则 (10-31)
· JAVA进阶:如何在JBOSS Server上发布EJB (10-31) · JAVA基础:一个struts+hibernate入门实例 (10-31)
· JavaBean实现多文件上传功能的两种方法 (10-31) · Java Servlet API说明文档 (10-31)
· JAVA基础:如何成为一个成功的Jsp程序员 (10-31) · 程序人生--一个程序员对学弟学妹建议 (10-31)
· J2EE基础:Spring的MVC模型运行序列分析 (10-31) · 检测JSP服务器内存的Ajax程序 (10-31)
  客户需求反馈表
* 姓  名:
更多资料  了解方案  认识厂商
* 单位名称:
* 联系电话:
* 电子邮件:
  赛迪推荐  
  手机·资费 ·新品·导购·评测·手机资费·宽带
手机搜索  诺基亚 N73 MOTO Z6
  IT产品 ·笔记本·台式机·服务器·打印·投影
IT产品搜索 
  IT技术 ·开发·网管·安全·数据库·操作系统
  信息化 ·热点·专题·访谈·周刊·方案案例
· 网购人均消费超千元 B2C市场销售环比现负增长
· 北京成立信息安全应急中心 24小时防奥运黑客
· 智能交通08年覆盖京城 怎样加强企业流程优化
· 电子监考系统解决方案 企业信息安全解决方案
  IT博客 ·曾剑秋·项立刚·Java学习·网管
  IT技术论坛 ·开发·网管·安全·数据库·系统