drools规则引擎实现动态配置规则
先说下我的业务需求背景,最近公司要推出运营活动,根据用户行为送用户积分;比如用户注册送、首次消费送,非首次消费送、累积消费送、针对我们这个的特殊要求是跟具体规则绑定;比如说
规则1 用户累积消费首次达到10000送积分20;
规则2 用户累积投资首次达到 20000 送积分40;
这两条规则是不能同时生效,但如果他们的时间是错开用户是可以针对这两条规则获取到奖励的
用户然后运营想做到的效果是服务端一次性做好,运营配置规则不用服务端再修改代码;这是运营需求.
经过调研决定用drools规则引擎来做,首先添加maven依赖:
<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-api</artifactId>
<version>${drools.version}</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-core</artifactId>
<version>${drools.version}</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-compiler</artifactId>
<version>${drools.version}</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-decisiontables</artifactId>
<version>${drools.version}</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-templates</artifactId>
<version>${drools.version}</version>
</dependency>
然后提供规则引擎的执行方法:
public T execute(List<Rule> ruleList, T t) {
if (CollectionUtils.isEmpty(ruleList) || t == null) {
return t;
}
logger.info("执行规则引擎 start ....");
System.setProperty("drools.dateformat", "yyyy-MM-dd HH:mm:ss");
KieHelper helper = new KieHelper();
for (Rule rule : ruleList) {
helper.addContent(rule.getRule(), ResourceType.DRL);
}
KieSession kSession = helper.build().newKieSession();
kSession.insert(t);
kSession.fireAllRules();
kSession.dispose();
logger.info("执行规则引擎 end ....");
return t;
}
推荐使用上面的方法,在添加规则时动态生产drl文件内容并保存到数据库,这样可以不用提前生成drl;在执行的时候直接查数据库,根据不同的类别,比如上面的消费可能有多条规则:比如 规则1消费满1000送10;满2000送20;这样可以一次同一用户行为下的多个规则都加载到规则引擎中,drl文件内容如下:
简单的这个规则对应的运营规则是用户充值200送100积分
package com.wakanda.ruleengine.service.api.event
import com.wakanda.ruleengine.service.api.event.MarketingEvent
rule "1543494757156"
date-effective "2018-08-30 01:58:00"
date-expires "2099-08-30 01:58:00"
activation-group "PASSENGER_BEHAVIOR_SUBJECT_RECHARGE_ALL_ALL_ALL_CHANNEL_SINGLE_AMOUNT_SINGLETON_MONEY"
salience 100.00
when
$s:MarketingEvent(scene == "PASSENGER_BEHAVIOR_SUBJECT_RECHARGE_ALL_ALL_ALL_CHANNEL_SINGLE_AMOUNT" , userType == 1 , useType == 1 , amount >= 200.0)
then
$s.setMarketingRuleId(136L);
$s.setActionType(1);
$s.setActionValue(100.0);
update($s);
end
复杂的:
package com.wakanda.ruleengine.service.api.event
import com.wakanda.ruleengine.service.api.event.MarketingEvent
rule "1542713687828"
date-effective "11-Aug-2017"
date-expires "13-Nov-2019"
activation-group "BEHAVIOR_SUBJECT_RECHARGE_ALL_ALL_CUMULATIVE_NUMBER_TOTAL_TIMES"
salience 600.00
when
$s:MarketingEvent(scene == "BEHAVIOR_SUBJECT_RECHARGE_ALL_ALL_CUMULATIVE_NUMBER" , useType == 1)
not MarketingEvent.UserBehavior(marketingRuleId == 77,userBehaviorUnit == 3, (3 > beforAmount), ($s.amount + beforAmount > 3 || $s.amount + beforAmount == 3)) from $s.userBehaviorList do[FIRST]
or MarketingEvent.UserBehavior(marketingRuleId == 77,userBehaviorUnit == 3, (3 > beforAmount), ($s.amount + beforAmount > 3 || $s.amount + beforAmount == 3)) from $s.userBehaviorList
then
$s.setMarketingRuleId(77L);
$s.setActionType(1);
$s.setActionValue(600.0);
update($s);
then[FIRST]
$s.setMarketingRuleId(77L);
$s.setActionType(1);
$s.setActionValue(0.0);
update($s);
end
有问题可加qq 2393399306,欢迎一起探讨
上一篇: solr更新操作
下一篇: python 更新所有依赖包的方法
推荐阅读
-
Sentinel集成Nacos实现动态流控规则
-
Drools 5.2 发布:开源的业务规则引擎
-
drools规则引擎与kie-wb和kie-server远程执行规则(7.18.0.Final)
-
复杂业务sql根据数据库sql配置表实现动态配置sql,业务改变不需要写代码,提交sql脚本即可实现业务规则改动。
-
SpringBoot整合Drools规则引擎动态生成业务规则的实现
-
Drools规则引擎-Drools入门案例
-
2-配置动态路由之虚拟服务与目标规则
-
开源力量公开课第70期:新一代规则引擎Drools概览
-
规则引擎Visual Rules Solution开发基础教程【连载24】-- 使用VisualRules规则引擎实现业务逻辑
-
规则引擎Visual Rules Solution开发基础教程【连载18】-- Linux环境 安装配置说明