Drools使用Excel文件中的规则

Drools Using Rules from Excel Files

1.概述

Drools支持以电子表格格式管理业务规则。

在本文中,我们将看到一个使用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文件:

     width=

    对于我们的简单示例,我们使用了最相关的一组关键字:

  • 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类提供对 所有Kie构建和运行时设施的访问。 它提供了几种工厂,服务和实用程序方法。 因此,让我们首先掌握一个KieServices实例:

    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项目中找到本文中使用的示例。