Drools Using Rules from Excel Files
1.概述
Drools支持以电子表格格式管理业务规则。 span>
在本文中,我们将看到一个使用Drools通过Excel文件管理业务规则的快速示例。
2. Maven依赖
让我们将所需的Drools依赖项添加到我们的应用程序中:
1 2 3 4 5 6 7 8 9 10 | <dependency> <groupId>org.kie</groupId> <artifactId>kie-ci</artifactId> <version>7.1.0.Beta2</version> </dependency> <dependency> <groupId>org.drools</groupId> <artifactId>drools-decisiontables</artifactId> <version>7.1.0.Beta2</version> </dependency> |
这些依赖关系的最新版本可以在kie-ci和drools-decisiontables中找到。
3.在Excel中定义规则
对于我们的示例,让我们定义规则以根据客户类型和作为客户的年数来确定折扣:
超过3年的个人客户可获得15%的折扣
少于3年的个人客户可获得5%的折扣
所有企业客户均可享受20%的折扣
3.1。 Excel文件
让我们开始根据Drools所需的特定结构和关键字创建excel文件:
对于我们的简单示例,我们使用了最相关的一组关键字:
RuleSet –表示决策表的开始
导入–规则中使用的Java类
RuleTable –指示规则集的开始
名称-规则名称
条件–要对照输入数据检查的条件的代码段。 一条规则应至少包含一个条件
ACTION –如果满足规则条件,则要执行的操作的代码段。 一条规则至少应包含一个动作。 在示例中,我们在Customer对象上调用setDiscount
此外,我们在Excel文件中使用了Customer类。 因此,让我们现在创建它。
3.2。 客户阶层
从excel工作表中的CONDITIONs和ACTION可以看出,我们正在使用Customer类的对象作为输入数据(类型和年份)并存储结果(折扣)。
客户类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | public class Customer { private CustomerType type; private int years; private int discount; // Standard getters and setters public enum CustomerType { INDIVIDUAL, BUSINESS; } } |
4.创建Drools规则引擎实例
在执行定义的规则之前,我们必须使用Drools规则引擎的实例。 为此,我们必须使用Kie核心组件。
4.1。 KieServices
KieServices类提供对 span> 所有Kie构建和运行时设施的访问。 它提供了几种工厂,服务和实用程序方法。 因此,让我们首先掌握一个KieServices实例: span>
1 | KieServices kieServices = KieServices.Factory.get(); |
使用KieServices,我们将创建KieFileSystem,KieBuilder和KieContainer的新实例。
4.2。 KieFileSystem
KieFileSystem是一个虚拟文件系统。 让我们向其中添加Excel电子表格:
1 2 3 4 5 6 | Resource dt = ResourceFactory .newClassPathResource("com/baeldung/drools/rules/Discount.xls", getClass()); KieFileSystem kieFileSystem = kieServices.newKieFileSystem().write(dt); |
4.3。 KieBuilder
现在,将其传递给KieBuilder来构建KieFileSystem的内容:
1 2 | KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem); kieBuilder.buildAll(); |
如果成功构建,它将创建一个KieModule(任何Maven生产的带有kmodule.xml的jar都是KieModule)。
4.4。 Kie资料库
该框架会自动将KieModule(从生成的结果)添加到KieRepository:
1 | KieRepository kieRepository = kieServices.getRepository(); |
4.5。 KieContainer
现在可以使用其KleModule的ReleaseId创建一个新的KieContainer。 在这种情况下,Kie分配了默认的ReleaseId:
1 2 3 | ReleaseId krDefaultReleaseId = kieRepository.getDefaultReleaseId(); KieContainer kieContainer = kieServices.newKieContainer(krDefaultReleaseId); |
4.6。 KieSession
现在,我们可以从KieContainer获取KieSession。 我们的应用程序与KieSession交互,该KieSession存储并在运行时数据上执行:
1 | KieSession kieSession = kieContainer.newKieSession(); |
5.执行规则
最后,是时候提供输入数据并触发规则了:
1 2 3 4 | Customer customer = new Customer(CustomerType.BUSINESS, 2); kieSession.insert(customer); kieSession.fireAllRules(); |
6.测试用例
现在让我们添加一些测试用例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | public class DiscountExcelIntegrationTest { private KieSession kSession; @Before public void setup() { Resource dt = ResourceFactory .newClassPathResource("com/baeldung/drools/rules/Discount.xls", getClass()); kSession = new DroolsBeanFactory().getKieSession(dt); } @Test public void giveIndvidualLongStanding_whenFireRule_thenCorrectDiscount() throws Exception { Customer customer = new Customer(CustomerType.INDIVIDUAL, 5); kSession.insert(customer); kSession.fireAllRules(); assertEquals(customer.getDiscount(), 15); } @Test public void giveIndvidualRecent_whenFireRule_thenCorrectDiscount() throws Exception { Customer customer = new Customer(CustomerType.INDIVIDUAL, 1); kSession.insert(customer); kSession.fireAllRules(); assertEquals(customer.getDiscount(), 5); } @Test public void giveBusinessAny_whenFireRule_thenCorrectDiscount() throws Exception { Customer customer = new Customer(CustomerType.BUSINESS, 0); kSession.insert(customer); kSession.fireAllRules(); assertEquals(customer.getDiscount(), 20); } } |
7.故障排除
Drools将决策表转换为DRL。 因此,很难处理Excel文件中的错误和错别字。 错误通常是指DRL的内容。 因此,要进行故障排除,它有助于打印和分析DRL:
1 2 3 4 5 6 7 8 9 | Resource dt = ResourceFactory .newClassPathResource("com/baeldung/drools/rules/Discount.xls", getClass()); DecisionTableProviderImpl decisionTableProvider = new DecisionTableProviderImpl(); String drl = decisionTableProvider.loadFromResource(dt, null); |
8.结论
在本文中,我们看到了一个使用Drools在Excel电子表格中管理业务规则的快速示例。 我们已经看到了用于在Excel文件中定义规则的结构和最少的关键字集。 接下来,我们使用了Kie组件来读取和触发规则。 最后,我们编写了测试用例以验证结果。
与往常一样,可以在Github项目中找到本文中使用的示例。