-
- 在drools中如果使用规则表
典型的用法就是根据excel创建KnowledgeBase,然后将它丢给session执行,执行的参数和结果都在params里面package com.xxx.yyyy; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.Map; import junit.framework.Assert; import org.drools.KnowledgeBase; import org.drools.KnowledgeBaseFactory; import org.drools.builder.DecisionTableConfiguration; import org.drools.builder.DecisionTableInputType; import org.drools.builder.KnowledgeBuilder; import org.drools.builder.KnowledgeBuilderFactory; import org.drools.builder.ResourceType; import org.drools.definition.KnowledgePackage; import org.drools.io.ResourceFactory; import org.drools.runtime.StatelessKnowledgeSession; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; @RunWith(Parameterized.class) public class IsP4PTest{ private IsP4P param; private String extected; public IsP4PTest(IsP4P param,String extected) { this.param = param; this.extected = extected; } public static class IsP4P { private String productLine; private String productType; private String playType; public IsP4P(String productLine,String productType,String playType){ this.productLine = productLine; this.productType = productType; this.playType = playType; } public Map<String,Object> getParams(){ Map<String,Object> params = new HashMap<String,Object>(); params.put("productLine", productLine); params.put("productType", productType); params.put("playType", playType); return params; } } public void testExcel(String fileName, Map<String, Object> params) throws Exception { System.out.println("---------------begin------------------------"); DecisionTableConfiguration dtableconfiguration = KnowledgeBuilderFactory .newDecisionTableConfiguration(); dtableconfiguration.setInputType(DecisionTableInputType.XLS); final KnowledgeBuilder kbuilder = KnowledgeBuilderFactory .newKnowledgeBuilder(); File file = new File("D:\\iwork-space\\rule\\src\\test\\resources\\" + fileName); InputStream is = new FileInputStream(file); // InputStream is = new ClassPathResource(fileName).getInputStream(); kbuilder.add(ResourceFactory.newInputStreamResource(is,"UTF-8"), ResourceType.DTABLE); if (kbuilder.hasErrors()) { System.out.println(kbuilder.getErrors().toString()); } Collection<KnowledgePackage> pkgs = kbuilder.getKnowledgePackages(); KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); kbase.addKnowledgePackages(pkgs); StatelessKnowledgeSession ksession = kbase .newStatelessKnowledgeSession(); ksession.execute(Arrays.asList(new Object[] {params})); System.out.println("---------------end------------------------"); } @Parameters public static Collection<?> contructData(){ return Arrays.asList(new Object[][]{ {new IsP4P("aa","true","null"),"true"}, {new IsP4P("bb","true","null"),"true"}, {new IsP4P("cc","true","aa"),"false"}, {new IsP4P("dd","false","bb"),"other"} }); } @Test public void testP4P() throws Exception{ Map<String,Object> params = new HashMap<String,Object>(); params.putAll(param.getParams()); testExcel("ka/isP4P.xls", params); Assert.assertEquals(extected, params.get("isP4P")); } }
- 什么时候考虑使用规则表
如果规则可以表示成 templates+data(模板+数据),可以考虑使用 decision tables。在决策表的每一行,采集数据和模板一起生成规则。使用基于决策表的Spreadsheet的API在Drools-decisiontables模块中。只有一个类:SpreadsheetCompiler. 这个类可以操作各种格式的Spreadsheet,并生成DRL规则(然后就可以常规的方式使用)。
- 一个典型的规则表的格式
- RuleSet关键字是必须的,名字是可选的
- Import语句非常像java的import,如果有多个import,用逗号隔开
- RuleTable关键字也是必须的,它指示了后面将会有一批rule,ruletable的名称将会作为以后生成rule的前缀
- 条件如果不写的话默认就是==, 比如上面的contract.get("productLine"),其实就是contract.get("productLine") == $param, 如果有多个参数可以使用$1,$2,比如我们经常用到的一个区间数据,这个占位符就派上用场了
- 所有的关键字都是忽略大小写的
- 默认情况下规则引擎只解析第一个sheet的规则
- 规则区域所支持的关键字
RuleSet | The package name for the generated DRL file. Optional, the default is rule_table .(默认值是rule_table) |
Must be First entry. |
Sequential | "true" or "false". If "true", then salience is used to ensure that rules fire from the top down.(规则触发是从上朝下,如果是false就是乱序) | Optional, at most once. If omitted, no firing order is imposed. |
Import | A comma-separated list of Java classes to import.(逗号隔开) | Optional, may be used repeatedly. |
Variables | Declarations of DRL globals, i.e., a type followed by a variable name. Multiple global definitions must be separated with a comma. 全局变量定义,多个用逗号隔开 | Optional, may be used repeatedly. |
Functions | One or more function definitions, according to DRL syntax. | Optional, may be used repeatedly. |
Queries | One or more query definitions, according to DRL syntax. | Optional, may be used repeatedly. |
需要特别注意的是这些关键字只能出现一次!
- Rule Table的头部所支持的关键字
NAME | N | Provides the name for the rule generated from that row. The default is constructed from the text following the RuleTable tag and the row number. | At most one column |
DESCRIPTION | I | A text, resulting in a comment within the generated rule. | At most one column |
CONDITION | C | Code snippet and interpolated values for constructing a constraint within a pattern in a condition. | At least one per rule table |
ACTION | A | Code snippet and interpolated values for constructing an action for the consequence of the rule. | At least one per rule table |
METADATA | @ | Code snippet and interpolated values for constructing a metadata entry for the rule. | Optional, any number of columns |
- 将excel编译成规则文件
package com.xxx.yyy; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; import org.drools.decisiontable.InputType; import org.drools.decisiontable.SpreadsheetCompiler; import org.junit.Test; public class SpreadsheetCompilerTest { @Test public void compile() throws FileNotFoundException{ File file = new File("D:\\iwork-space\\rule\\src\\test\\resources\\ka\\isP4P.xls"); InputStream is = new FileInputStream(file); SpreadsheetCompiler converter = new SpreadsheetCompiler(); String drl = converter.compile(is, InputType.XLS); //--------exception here-------- System.out.println("\n\n" + drl); } }
编译后的结果如下:
这个地方注意一点,==和equals是相同的,!= 和 !equals是相同的
// Similar to: java.util.Objects.equals(person.getFirstName(), "John")
// so (because "John" is not null) similar to:
// "John".equals(person.getFirstName())
Person( firstName == "John" )
The != operator has null-safe !equals() semantics:
// Similar to: !java.util.Objects.equals(person.getFirstName(), "John")
Person( firstName != "John" )
相关推荐
规则引擎一般是一下情况使用 1.为提高效率,管理流程必须自动化,即使现代商业规则异常复杂。 2.市场要求业务规则经常变化,IT系统必须依据业务规则的变化快速、低成本的更新。 3.为了快速、低成本的更新,业务人员...
2. **灵活的规则格式**:除了传统的`.drl`规则文件,Drools还支持XML、Excel等格式的规则定义,极大地提高了规则的灵活性和可维护性。 3. **KIE框架**:Drools6引入了KIE框架,简化了规则引擎的调用和管理过程,...
8. **集成到项目**:文档会提供将Drools集成到Java项目中的步骤,包括依赖添加、规则库的构建、以及如何在代码中使用Drools API。 9. **优化与性能**:Drools提供了多种性能优化手段,如规则排序、并行执行等。这...
drools决策表模版
总之,《Drools 4.0官方使用手册中文》是一份全面且实用的教程,对于希望在Java环境中应用规则引擎的开发者,尤其是那些对Drools感兴趣的读者,它是必不可少的参考资料。通过学习,你可以掌握规则引擎的精髓,提升你...
5. **决策表(Decision Tables)**:Drools支持使用Excel或CSV格式的决策表来编写规则,这使得非技术人员也能参与规则的制定。手册会说明如何创建和使用决策表。 6. **事件处理**:Drools提供对事件驱动编程的支持...
总的来说,droolsdemo和exceldemo提供了关于如何在实际项目中使用Drools和KIE平台的宝贵示例,涵盖了从规则定义、转换、加载到执行的整个生命周期。这对于学习和理解Drools如何处理业务逻辑和决策,以及如何与其他...
- **Excel**:支持使用Excel表格定义规则,便于非技术人员使用。 #### 七、Drools HelloWorld 示例 以下是一个简单的Drools HelloWorld示例,展示了如何定义和执行一条简单的规则: ```java // 定义规则文件hello...
Drools是一款强大的规则引擎,由Red ...通过这个"Drools规则引擎使用demo",你可以学习如何配置、加载规则,以及如何在Java应用程序中使用Drools进行规则的执行和事实的管理。这将为你构建智能决策系统提供坚实的基础。
drools决策表示例Excel文件
4. **决策表**:Drools支持使用Excel或CSV格式的决策表来定义规则,这种方式对非技术人员更加友好,便于规则的维护和审查。 5. **融合JBOSS BRMS**:Drools是JBoss Business Automation的一部分,与BRMS(Business ...
3. **Drools决策表(Decision Tables)**: Drools支持使用Excel或CSV格式的决策表来编写规则,这种方式使得非程序员也能参与到规则的制定中,提高了业务规则的可维护性和可理解性。 4. **Drools流程(Drools Flow)...
3. **Drools 工作流程**:首先,开发者使用Drools提供的DSL编写规则,然后将规则加载到规则引擎中。接着,通过Facts(事实)对象将业务数据输入到引擎。引擎会根据这些事实和已加载的规则进行推理,最后触发相应的...
Drools4Demo 是一个基于Drools规则引擎的演示项目,它展示了如何在实际应用中使用Drools进行业务规则管理和决策。Drools是一个强大的开源规则引擎,由JBOSS公司开发,现属于Red Hat公司的一部分。它提供了一个灵活、...
5. **决策表(Decision Tables)**:Drools支持使用Excel或CSV格式的决策表来编写规则,使得非技术人员也能理解和维护规则。 6. **流程(Processes)**:除了规则引擎,Drools还提供了工作流引擎,可以定义和执行...
5. **决策表(Decision Table)**:Drools支持使用Excel或CSV格式的决策表来编写规则,这使得非技术人员也能参与到业务规则的定义中,提高了规则的可读性和维护性。 6. **事件处理(Event Processing)**:Drools5...
如果你在使用过程中遇到任何问题,这个示例项目将为你提供参考,帮助你更好地理解和应用Drools7的功能。通过研究这个示例,你可以学习如何创建、加载和执行规则,以及如何利用Drools7的新特性来解决实际的业务挑战。
开发者只需要将这些库添加到项目的类路径中,就可以开始使用Drools进行业务逻辑的编程和决策管理。为了更好地使用这些库,开发者需要熟悉Drools的API,理解DRL语言,并了解如何组织和管理规则文件。同时,了解如何与...
Drools 是一个强大的规则引擎,它允许开发人员在Java应用程序中使用声明式的方式来处理复杂的业务逻辑。Drools 6是其第六个主要版本,带来了许多改进和新特性,使得它更加适合大型企业级应用。这个"drools6学习例子...
在实际使用中,kie-drools-wb的运行需要一定的环境配置,包括Java运行环境(JRE)和可能的服务器平台,如Tomcat或WildFly。开发者会将这些jar文件添加到应用的类路径中,以便于Drools Workbench能够正常启动并提供...