Drools规则引擎介绍
- 格式:ppt
- 大小:1.19 MB
- 文档页数:15


drools xml生成规则Drools XML生成规则在软件开发中,规则引擎是一个重要的组件,它可以根据预定义的规则来决定程序的行为。
Drools是一种基于Java的规则引擎,它使用XML格式来定义和生成规则。
本文将介绍如何使用Drools XML 生成规则,并探讨一些相关的概念和技术。
一、规则引擎和Drools简介规则引擎是一种用于处理条件和动作之间关系的软件组件。
它基于一组规则来推断出程序的下一步操作。
规则引擎可以在运行时根据不同的条件执行不同的动作,从而实现灵活的业务逻辑。
Drools是一个基于Java的开源规则引擎,它提供了一组API和工具,用于定义、管理和执行规则。
Drools使用一种名为DRL (Drools Rule Language)的语言来描述规则。
DRL是一种文本格式,可以通过编写DRL文件来定义规则。
二、使用Drools XML生成规则除了使用DRL文件,Drools还支持使用XML格式来生成规则。
下面是一个简单的Drools XML规则示例:```<?xml version="1.0" encoding="UTF-8"?><rules><name>Rule1</name><description>Rule description</description><when><and><condition><name>Condition1</name><expression>condition expression</expression> </condition><condition><name>Condition2</name><expression>condition expression</expression> </condition></and></when><then><action><name>Action1</name><expression>action expression</expression></action></then></rule>```上述示例中,使用了一个`<rules>`元素作为根元素,其中包含了一个`<rule>`元素。
drools 的高级语法Drools的高级语法。
Drools是一个基于规则引擎的开源项目,它提供了一个强大的规则引擎和业务规则管理系统。
Drools规则引擎使用一种称为DRL (Drools Rule Language)的领域特定语言来描述业务规则。
DRL 语言具有丰富的高级语法,使得用户可以更加灵活地描述规则和条件。
1. 规则定义。
在DRL中,规则的定义是使用关键字“rule”开头,后面跟着规则的名称和条件。
例如:rule "Discount Rule"when.$order : Order(total > 1000)。
$order.applyDiscount(0.1);end.在上面的例子中,我们定义了一个名为“Discount Rule”的规则,当订单总金额大于1000时,就会触发该规则,给订单应用10%的折扣。
2. 条件语法。
DRL语言提供了丰富的条件语法,包括逻辑操作符、比较操作符、集合操作符等,使得用户可以更加灵活地描述规则条件。
例如:rule "Age Rule"when.$person : Person(age > 18 && age < 60, gender == "male")。
$person.setCategory("Adult Male");end.在上面的例子中,我们定义了一个名为“Age Rule”的规则,当人的年龄在18到60之间且性别为男性时,就会触发该规则,将该人员的类别设置为“成年男性”。
3. 函数和方法调用。
DRL语言还支持在规则中调用函数和方法,这使得用户可以更加灵活地处理规则逻辑。
例如:rule "Tax Rule"when.$order : Order()。
then.$order.calculateTax();end.在上面的例子中,我们定义了一个名为“Tax Rule”的规则,当订单被匹配时,就会触发该规则,调用订单的计算税金方法。
Drools的使用什么是DroolsDrools是一个基于Java的规则引擎,它能够帮助开发者以一种简单、易于理解的方式来管理和执行业务规则。
它提供了一个强大的规则引擎,允许用户定义和管理业务规则,并将这些规则应用到应用程序中的数据上。
Drools的核心是一个基于规则的语言,即Drools Rule Language(DRL)。
通过使用DRL,开发者可以定义规则、条件和操作,以及规则之间的关系。
Drools引擎可以解析和执行这些规则,并根据规则的评估结果进行相应的操作。
Drools的优势Drools具有以下几个优势:1. 灵活性Drools允许开发者以一种灵活的方式定义规则,并根据实际需求进行修改和调整。
规则可以通过简单的文本编辑器进行编写,也可以通过使用Drools提供的规则编辑器进行可视化编辑。
这使得开发者能够快速响应业务需求的变化,并进行规则的动态更新。
2. 可读性和可维护性Drools的规则语言(DRL)采用了一种易于理解的语法,使得规则的编写和维护变得简单。
规则可以根据业务需求进行组织和分组,使得规则的管理和维护更加清晰和可靠。
此外,Drools还提供了一些工具和插件,可以帮助开发者进行规则的调试和测试,进一步提高规则的可读性和可维护性。
3. 高性能Drools引擎是一个高性能的规则引擎,它能够处理大量的规则和数据,并在短时间内完成规则的评估和操作。
Drools引擎采用了一些优化策略,如规则的编译和缓存,以提高规则的执行效率。
此外,Drools还支持多线程和分布式处理,可以进一步提高规则引擎的性能和扩展性。
4. 与Java的无缝集成Drools是一个基于Java的规则引擎,它可以与Java应用程序无缝集成。
开发者可以使用Java代码调用Drools引擎,并将规则应用到Java对象上。
Drools提供了一些API和工具,可以帮助开发者在Java应用程序中使用规则引擎,使得规则的集成变得简单和方便。
规则引擎-drools使⽤讲解(简单版)-Javadrools规则引擎现状:1. 运维同学(各种同学)通过后台管理界⾯直接配置相关规则,这⾥是通过输⼊框、下拉框等完成输⼊的,⾮常简单;2. 规则配置完毕后,前端请求后端,此时服务端根据参数(即规则)⽣成drl规则⽂件;3. ⽤户侧有相关请求到达时,服务端加载规则⽂件(可能是多个,⼀般⼀个⼴告、活动对应⼀个规则⽂件),并通过引擎去检查当前⽤户各种状态是否满⾜规则⽂件;4. 将所有满⾜的规则⽂件对应的⼴告、活动进⾏下发,同时更新⽤户数据;5. 完成整个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";}@Overridepublic 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 -- 创建⼀个类去⽣成规则⽂件⽐如⽣成 music.drl 的⾳乐规则⽂件,这⼀步是可选的,区别在于规则⽂件的⽣成是代码⽣成,还是⼈⼯⽣成,我们的项⽬中是运维同学在后台管理界⾯通过⼀些图形化输⼊框输⼊⼀些指定参数,⽽⽣成规则⽂件是服务端代码⽣成的,因此有了这部分,⽐较实⽤,⼀⽅⾯可以降低⽣成规则⽂件的门槛,任何⼈都可以做,另⼀⽅⾯也避免了⼈⼯出错的可能;public class ActivityUtil {/*** rule template string*/private static String template ="package com.aispeech.dsl\r\n\r\n" +"import {entity_package_path};\r\n\r\n" +"import {entity_package_path}.*;\r\n\r\n" +"rule \"{rule_name}\"\r\n\r\n" +"when\r\n" +"\t{instance_name}:{class_name}({rules})\r\n" +"then\r\n" +"\t{do}\r\n" +"end";private static final String AND = " && ";private static final String OR = " || ";/*** get business rule file xxx.drl* @param carActivity user info entity* @param clazz entity class* @return*/public static File createBusinessRuleFile(Car_activity carActivity, Class clazz, String[] param_texts, String[] param_values) { String ruleStr = template;String entity_package_path = (clazz+"").substring(6);String rule_name = "rule_"+carActivity.getId();String class_name = (clazz+"").substring((clazz+"").lastIndexOf(".")+1);String instance_name = class_name.toLowerCase();String rules = "";JSONArray conditionArray = JSONArray.parseArray(carActivity.getAim_condition());for(int i=0;i<conditionArray.size();i++) {JSONObject condition = conditionArray.getJSONObject(i);rules += "\r\n\t\t("+condition.getString("param")+condition.getString("operator")+condition.getString("value")+")" + AND;}rules = rules.length()>0?rules.substring(0, stIndexOf(AND)):rules;for (String param_value : param_values) {rules += "\r\n\t\t,"+param_value.toLowerCase()+":"+param_value;}String content = JSONObject.parseObject(carActivity.getContent()).getString("content");String tts = carActivity.getTts();for (int i=0;i<param_texts.length;i++) {content = content.replace("#"+param_texts[i]+"#", "\"+"+param_values[i]+"+\"");tts = tts.replace("#"+param_texts[i]+"#", "\"+"+param_values[i]+"+\"");}String _do = instance_name+".setCan_push(true);";_do += "\r\n\t" + instance_name+".setContent(\""+content+"\");";_do += "\r\n\t" + instance_name+".setTts(\""+tts+"\");";return returnFile(ruleStr, entity_package_path, rule_name, class_name, instance_name, _do, rules);}/*** @param ruleStr* @param entity_package_path* @param rule_name* @param class_name* @param instance_name* @param _do* @param rules* @return*/private static File returnFile(String ruleStr, String entity_package_path, String rule_name, String class_name,String instance_name, String _do, String rules) {ruleStr = ruleStr.replace("{entity_package_path}", entity_package_path).replace("{rule_name}", rule_name).replace("{class_name}", class_name).replace("{instance_name}", instance_name).replace("{do}", _do).replace("{rules}", rules);System.out.println(ruleStr);return FileUtil.getFileFromText(rule_name, ".drl", ruleStr);}}step 4.1 -- 通过字符串创建⽂件,给上⼀步⽤的函数public static File getFileFromText(String tempFileName, String fileTail, String text) {try {File file = File.createTempFile(tempFileName, fileTail);FileOutputStream fos = new FileOutputStream(file);fos.write(text.getBytes());if(fos!=null){fos.close();}return file;} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return null;}step 5 -- 规则⽂件加载,并⽤以检查当前⽤户是否满⾜下发规则条件BaseRules baseRules = new CarIllegalRules(count, money, points);if(baseRules!=null) {("before fire rules:"+baseRules);DSLUtil.fireRules(ActivityUtil.createBusinessRuleFile(car_activity, baseRules.getClass(),baseRules.getParam_text().split(","), baseRules.getParam_value().split(",")), baseRules);("after fire rules:"+baseRules);if(baseRules.isCan_push()) {//In here, the rules are used to judge the success of the entity, and you can do something}}⼩结本⽂通过对drools的简单使⽤步骤的讲解,为⼤家展⽰了drools最简单的使⽤⽅式,⽽它能做到的远远不⽌看到的这些,但是基本框架是这样,⼤家可以尝试挖掘规则⽂件的⼀些⿊操作,可以对多变的业务进⾏极致的抽象,再也不⽤为了这些重新发版啦,LOL;PS:想深⼊了解的同学还是要去看看Rete算法、drools的推理机制等等,本⽂主要从该引擎的⼊门出发哈;最后⼤家可以到我的Github上看看有没有其他需要的东西,⽬前主要是⾃⼰做的机器学习项⽬、Python各种脚本⼯具、数据分析挖掘项⽬以及Follow的⼤佬、Fork的项⽬等:。