规则引擎 - drools 使用讲解(简单版) - Java

规则配置完毕后,前端请求后端,此时服务端根据参数(即规则)生成drl规则文件;

用户侧有相关请求到达时,服务端加载规则文件(可能是多个,一般一个广告、活动对应一个规则文件),并通过引擎去检查当前用户各种状态是否满足规则文件;

将所有满足的规则文件对应的广告、活动进行下发,同时更新用户数据;

完成整个drools相关流程;

关于

drools是一款标准、效率高、速度快的开源规则引擎,基于ReteOO算法,目前主要应用场景在广告、活动下发等领域非常多,比如APP的活动下发,通常都是有很多条件限制的,且各种活动层出不穷,无法代码穷举,而如果每次为了一个活动重新发版上线,显然是不合理的,因此通过drools将活动中变的部分抽象为一个个单独的规则文件,来屏蔽这部分的变化,使得系统不需要从代码层面做出改变,当然了为了更加极致的抽象,通常还需要对规则中的一些可配条件(大于、小于、等于、范围、次数等)也提取到数据库中,这样在现有规则不满足要求时,可以直接通过更改数据库的对应规则表来完善,同样不需要改代码;

我们当时的需求主要就是广告、活动下发规则比较多,广告也是各式各样,因此去调研了drools,对drools也没有过多的挖掘其更多特性,因此还需要大家的指点;

drools简单使用

服务端项目中使用drools的几个基本步骤;

step 1 -- 添加相关依赖到maven pom.xml <dependency> <groupId>org.drools</groupId> <artifactId>drools-core</artifactId> <version>6.4.0.Final</version> </dependency> <dependency> <groupId>org.drools</groupId> <artifactId>drools-compiler</artifactId> <version>6.4.0.Final</version> </dependency> step 2 -- 创建实体类加载规则文件 public class CarIllegalRules extends BaseRules{ public static void main(String[] args) { try { KieServices ks = KieServices.Factory.get(); KieContainer kContainer = ks.getKieClasspathContainer(); KieSession ksession = kContainer.newKieSession("ksession-rules"); CarIllegalRules carIllegalRules = new CarIllegalRules(10,500,10); ksession.insert(carIllegalRules); ksession.fireAllRules(); System.out.println(carIllegalRules.isCan_push()+","+carIllegalRules.getContent()); } catch (Exception e) { e.printStackTrace(); } } private int illegal_count; private int illegal_money; private int illegal_points; public CarIllegalRules(int illegal_count, int illegal_money, int illegal_points) { super(); this.illegal_count = illegal_count; this.illegal_money = illegal_money; this.illegal_points = illegal_points; this.param_value = "illegal_count,illegal_money,illegal_points"; } @Override public String toString() { return "CarIllegalRules [illegal_count=" + illegal_count + ", illegal_money=" + illegal_money + ", illegal_points=" + illegal_points + ", can_push=" + can_push + ", content=" + content + ", tts=" + tts + "]"; } public int getIllegal_count() { return illegal_count; } public void setIllegal_count(int illegal_count) { this.illegal_count = illegal_count; } public int getIllegal_money() { return illegal_money; } public void setIllegal_money(int illegal_money) { this.illegal_money = illegal_money; } public int getIllegal_points() { return illegal_points; } public void setIllegal_points(int illegal_points) { this.illegal_points = illegal_points; } }

PS:main函数是用来测试这个类的;

step 3 -- 创建DSLUtils类去执行相应规则 public class DSLUtil { public static void fireRules(File file, Object rules) { try { KieServices kieServices = KieServices.Factory.get(); KieFileSystem kfs = kieServices.newKieFileSystem(); Resource resource = kieServices.getResources().newFileSystemResource(file); fire(rules, kieServices, kfs, resource); } catch (Exception e) { e.printStackTrace(); } } public static void fireRules(String urlStr, Object rules) { try { KieServices kieServices = KieServices.Factory.get(); KieFileSystem kfs = kieServices.newKieFileSystem(); Resource resource = kieServices.getResources().newFileSystemResource(FileUtil.getFileFromUrl(urlStr)); fire(rules, kieServices, kfs, resource); } catch (Exception e) { e.printStackTrace(); } } private static void fire(Object commonRules, KieServices kieServices, KieFileSystem kfs, Resource resource) throws Exception { resource.setResourceType(ResourceType.DRL); kfs.write(resource); KieBuilder kieBuilder = kieServices.newKieBuilder(kfs).buildAll(); if (kieBuilder.getResults().getMessages(Message.Level.ERROR).size() > 0) { throw new Exception(); } KieContainer kieContainer = kieServices.newKieContainer(kieServices.getRepository().getDefaultReleaseId()); KieBase kBase = kieContainer.getKieBase(); KieSession ksession = kBase.newKieSession(); ksession.insert(commonRules); ksession.fireAllRules(); } } step 4 -- 创建一个类去生成规则文件

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zygysz.html