在招商报名系统中,需要对店铺和商品的资质进行筛选。这个筛选过程比较复杂,因此开发了一个规则引擎来保存、解析和执行规则。
在规则引擎中,有几个主要的抽象模型:规则、操作符、执行引擎
1. 规则
在规则引擎中,规则是树状结构的,由一个根节点和若干个子节点组成。对应的java类是Rule,该类的属性有:ruleDO(RuleDO),parent(Rule),children(List<Rule>)。
Rule类主要保存的是规则树的结构信息,具体的规则节点信息保存在RuleDO类中。
RuleDO中保存的主要信息有:规则ID,规则组ID(同一个规则树的节点属于一个规则组),父节点ID,左参数,右参数,操作符。
当规则引擎执行时,获取RuleDO对象,根据操作符获取具体的操作符对象并执行。左参数是变量,需要通过其他接口获取的值,一般和店铺或商品有关。右变量是固定的,在活动创建时选择的规则的值。
2. 操作符
操作符是规则是否满足的判断行为的抽象。在招商系统中,目前有10个操作符:And, Or, BitAnd, Between, Equal, In, InCategory, InTag, ItemCatBetween, Not。
这10个操作符可以分为两种类型:原子操作符和非原子操作符。原子操作符指不需要任何子规则计算的,它直接对左参数和右参数进行计算。非原子操作符是指他本身没有左参数和右参数,而是对子规则的计算结果进行计算。
原子操作符:BitAnd, Between, Equal, InCategory, InTag, ItemCatBetween, In。
非原子操作符:And, Or, Not
And 要把Rule对象中的子规则都执行一遍,才返回true
Or 只要Rule对象中子规则中有一个执行通过,就返回true
原子操作符是对直接对数据做判定的。其中左参数是变量,右参数是常量。右参数是小二设置的,左参数需要系统动态获取。这其中涉及到了左参数的数据来源问题。每一个左参数都需要有一个明确的数据来源,在报名系统中,定义在fact.xml中。每一个可用的左参数都对应一个factId,tmc_rule中left_param记录的就是这个factId。
在fact.xml中,定义了左参数的元数据。包括id,dataType, getMethod,parameters。
getMethod定义了数据获取方式,包括两个部分:接口变量名和方法名。在执行引擎的执行session中会持有外部接口的实例,getMethod的前半部分记录的就是这个实例的变量名,getMethod的另外一部分是方法名称。
parameters定义的是调用外部接口需要的参数。包括类型、来源和值。来源有三个:context,static, rightParam。
组合使用getMethod和parameters,根据变量名拿到变量实例,获取Class信息,通过反射拿到Method,通过Parameter从上下文、静态变量或者是右参数拿到方法的参数值,通过反射执行方法,拿到最终的左参数的变量值。反射的两个类为sellerPropertiesManager和itemPropertiesManager
3. 执行引擎
RuleExecutor是规则引擎对外的接口
ExecuteResult execute(Rule rule,ExecuteSession fact);
这个接口可以执行单个的规则,也可以执行一组规则。
ExecuteSession对象来保存规则执行需要使用的上下文信息,包括上下文参数,以及需要使用的接口实例:
private RuleExecutor ruleExecutor; //规则执行入口
private RuleManager ruleManager; //规则获取入口,ibatis,获取几种操作符的规则数,有的组织关系,有的直接操作数据
private FactManager factManager; //用户元数据获取配置
private SellerPropertiesManager sellerPropertiesManager;//通过用户元数据获取时,反射method调用入口
private ItemPropertiesManager itemPropertiesManager;//通过商品元数据获取时,反射method调用入口
private ExecutorThreadPool executorThreadPool;//规则执行线程池
private static final Logger logger = LoggerFactory.getLogger(RuleExecuteServiceImpl.class);
itemPropertiesManager、sellerPropertiesManager、factManager。
类图如下:
招商平台规则和规则树的对应关系
bm_qualification表中的规则为了前台规则展示用的,一条对应一行。
bm_qualification表中的ruleid 对应前台一条展示的规则树的根。
然后通过根可以在tmc_rule里面找到整个规则数
一般查询方式为:
select * from bm_qualification where baoming_config_id=9658
找到某一条rule_id为119100
在到taobao_heart库tmc_rule中找 select * from tmc_rule where rule_id= 119100
select * from tmc_rule where group_id=119100得到整棵规则数
使用到的设计模式:
1.工厂模式,执行到规则的时候,获取操作符,通过操作符工厂生产
使用反射的地方
private Object reflect(String className,String methodName,ExecuteSession session,List<Parameter> parameters)throws Exception{
Class<?> clazz = session.getPropertiesManager(className).getClass();
Class<?>[] parameterClass = new Class<?>[parameters.size()];
for (int i = 0; i < parameters.size(); i++) {
parameterClass[i] = parameters.get(i).getType();
}
Method method = clazz.getMethod(methodName, parameterClass);
Object[] objects = new Object[parameters.size()];
for (int i = 0; i < parameters.size(); i++) {
Parameter parameter = parameters.get(i);
Object value = getValue(parameter, session.getContext());
objects[i] = value;
}
Object result = method.invoke(session.getPropertiesManager(className), objects);
return result;
}
分享到:
相关推荐
Easy Rules,Drools,Aviator表达式求值引擎,Rule Book、Oracle Rules SDK、Blaze (fico)、IBM Decision Manager,DTRules,DSL规则引擎 规则引擎由三部分 事实(Fact):已知对象,比如以上刷卡的行为,即成事实...
在本文中,我们将深入探讨如何使用C#编程语言与Windows Workflow Foundation (WWF)来构建一个规则引擎。规则引擎是一种软件系统,它允许程序在运行时动态地执行和修改业务规则,无需更改代码基础结构。C#结合WWF提供...
规则引擎的主要思想是将应用程序中的业务决策部分分离出来,并使用预定义的语义模块编写业务决策(业务规则),由用户或开发者在需要时进行配置、管理。 使用规则引擎的优势如下: 1、业务规则与系统代码分离,实现...
特色 风控系统, 规则引擎, 动态接口配置(低代码)Groovy DSL 动态规则(rule)执行引擎。DSL(特定领域语言): 开发 和 业务 共识的语言。方便业务表达需求, 方便开发理解业。一个业务需求(一般程序或一个接口)可以抽象...
"java规则引擎说明" Java规则引擎是指使用Java语言开发的一种规则引擎,能够根据事实对象和规则文件计算规则结果。下面是Java规则引擎的详细说明: 一、规则引擎介绍 规则引擎是指能够根据事实对象和规则文件计算...
可视化规则引擎是一种图形化界面工具,允许用户通过拖拽组件和设定条件逻辑,直观地创建、编辑和管理复杂的业务规则和决策流程,而无需编码。有以下几个核心特点: 1. 图形化界面:提供用户友好的界面,用户可以直接...
【Drools规则引擎从入门到精通】 Drools是一个强大的业务规则管理系统,它提供了业务规则引擎、Web创作工具(Drools Workbench)以及决策模型符号(DMN)的支持。作为一个开源项目,Drools使用Java编写,遵循Apache...
Drools是一款强大的规则引擎,由Red Hat公司开发并维护,它主要用于实现业务规则的管理和执行。Drools提供了一种声明式的方式来定义业务规则,使得非技术人员也能理解和修改规则,从而降低了业务逻辑与代码的耦合度...
规则引擎是一种软件系统,它允许业务规则以声明式的方式进行编码,从而使得非技术人员也能理解和修改这些规则。这种技术在处理复杂逻辑判断时特别有用,因为它可以将业务规则与核心应用程序逻辑分离,使得规则的更新...
规则引擎-数据库访问操作 规则引擎是指一类可以根据预定义的规则对数据进行处理和分析的软件系统。这种系统通常具有强大的数据处理能力和灵活的规则配置能力。然而,传统的规则引擎产品通常不具备访问数据库的功能...
**Aviator 规则引擎详解** Aviator 是一个开源的Java表达式执行引擎,它主要用于实现复杂的业务逻辑和规则计算。作为一个轻量级的规则引擎,Aviator 提供了一种简洁而强大的方式来处理动态计算和决策过程。本文将...
《规则引擎:规则测试与轨迹跟踪详解》 规则引擎作为一种强大的业务逻辑处理工具,它允许开发者以声明式的方式定义规则,使得复杂的业务决策能够被高效地执行和管理。本文将深入探讨规则引擎中的规则测试和轨迹跟踪...
**规则引擎Drools.NET移植版** Drools是一款强大的业务规则管理系统,源自Java社区,以其灵活、高效和可扩展的特性而广受赞誉。它允许开发者将业务逻辑以规则的形式编写,使得业务规则可以独立于应用程序代码进行...
Drools是一个基于java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的形式存放在文件中,使得规则的变更不需要修正代码重启机器就可以立即在线上环境生效。具有易于访问企业策略、易于...
Drools 规则引擎文档教程 Drools 规则引擎是一种基于 Java 的开源规则引擎,主要用来解决复杂的业务逻辑问题。下面是 Drools 规则引擎在在线申请信用卡业务场景中的应用。 问题引出现有一个在线申请信用卡的业务...
### 规则引擎Drools使用手册:4.0版更新要点详解 #### 一、Drools 4.0新特性概览 Drools 4.0是一次重要的更新,相较于之前的Drools 3.0.x系列,在语言表达、引擎性能以及工具实用性等方面都有显著提升。以下为此次...
### 基于Spring的规则引擎 #### 一、引言 随着信息技术的发展,企业级应用系统的复杂性不断增加,为了更好地应对不断变化的市场需求和业务环境,开发灵活、可扩展的应用系统成为当前的一个重要趋势。业务规则作为...
标题与描述概述的知识点主要集中在规则引擎及其与J2EE平台的结合上,这涉及到企业级应用的灵活性提升以及业务规则的动态管理。下面将详细展开这些知识点。 ### 规则引擎简介 规则引擎是一种软件组件,用于评估和...