附:Drools 规则引擎集成实战

487 阅读1分钟

使用方法

从字符串加载规则

@Test
public void test() {
    KieServices kieServices = KieServices.Factory.get();
    KieFileSystem kieFileSystem = kieServices.newKieFileSystem();
    // 将决策表添加到KieFileSystem中
    String drl =
            "package rules\n" +
            "import org.dtt.entity.Person\n" +
                    "rule "AgeCheck"\n" +
                    "when\n" + "        $person : Person( age < 18 )\n" + "    " +
                    "then\n" + "        System.out.println( $person.getName() + " is under 18." );\n" +
                    "end\n";
    kieFileSystem.write("src/main/resources/rules/rules.drl", drl);
    // 将KieFileSystem装载到KieContainer中
    KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem);
    kieBuilder.buildAll();
    KieContainer kieContainer = kieServices.newKieContainer(kieServices.getRepository().getDefaultReleaseId());
    // 创建KieSession
    KieSession kieSession = kieContainer.newKieSession();
    // 创建Person实例并将其加入KieSession中
    Person person = new Person();
    person.setAge(12);
    person.setName("xshe");
    kieSession.insert(person);
    // 执行规则
    kieSession.fireAllRules();
}

从指定文件加载规则

使用Drools从指定的规则文件执行主要有四步:

/**
* 从指定的规则文件执行
*/
@Test
public void readRulesFromFile() {
    //①构建Drools内存环境
    KieServices kieServices = KieServices.Factory.get();
    KieContainer kieContainer = kieServices.getKieClasspathContainer();
    KieSession kieSession = kieContainer.newKieSession();
    //②加载规则文件
    KieFileSystem kieFileSystem = kieServices.newKieFileSystem();
    kieFileSystem.write(
        ResourceFactory.newClassPathResource("rules/loan-approval.drl"));
    KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem);
    kieBuilder.buildAll();
    //③构建Fact
    Applicant applicant = new Applicant("Joe", 23, 900, 10000);
    LoanApplication loanApplication = new LoanApplication(applicant,100000);
    kieSession.insert(applicant);
    kieSession.insert(loanApplication);
    //④执行规则
    kieSession.fireAllRules();
    kieSession.dispose();
    assertTrue(loanApplication.isApproved());
}

fact是一个业务对象,是规则文件中的事实,并且需要插入Drools内存环境中。在执行规则时,Drools会读取规则文件,并且匹配当前业务对象,如果找到匹配的规则,就会执行该规则。

从数据库中动态加载规则内容

步骤说明

  • 在数据库中存储规则的内容,例如:在MySQL数据库中存储DRL文件的内容。
  • 使用Java代码从数据库中读取规则的内容。您可以使用JDBC连接数据库并执行SQL查询以读取规则的内容。
  • 将规则的内容转换为DRL文件。您可以将读取的字符串数据写入到DRL文件中。
  • 使用Drools加载DRL文件。使用KieFileSystem加载DRL文件,然后将加载的规则添加到KieBuilder中。
  • 使用KieServices创建一个KieContainer。由KieContainer创建KieSession,并动态加载新的规则。