Drools 6 从字符串加载并执行规则

标签 drools

我正在尝试从 Drools 6 中的字符串加载规则,如下所示:

// the rule
def drl = '''
dialect "mvel"

rule "Person is over 18"
    when
        $person : Person(age > 18)
    then
        System.out.println("Person is "+$person.name);
end
'''
// setup for rule
KieServices kieServices = KieServices.Factory.get()
KieFileSystem kfs = kieServices.newKieFileSystem()
kfs.write( "src/main/resources/simple.drl",
    kieServices.getResources().newReaderResource( new StringReader(drl) ) )
KieBuilder kieBuilder = kieServices.newKieBuilder( kfs ).buildAll()

// check there have been no errors for rule setup
Results results = kieBuilder.getResults();
if( results.hasMessages( Message.Level.ERROR ) ){
    println( results.getMessages() )
    throw new IllegalStateException( "### errors ###" )
}
KieContainer kieContainer =
    kieServices.newKieContainer( kieBuilder.getKieModule().getReleaseId() )
KieSession kieSession = kieContainer.newKieSession()

// insert facts and fire rules
kieSession.insert(new Person("Jon Doe", 21))
kieSession.insert(new Person("Jon Darcy", 1))
kieSession.fireAllRules()

kieSession.dispose()

@Immutable
class Person {
    String name
    int age
}

我想要的是将人名打印出来。通过附加事件监听器和记录器,我可以看到事实已被添加和断言。通过在 drl 中出现错误,我可以确定规则已被看到并编译。但该规则永远不会触发。

我很确定代码中的某个地方存在一个愚蠢的小错误。有人可以帮助我吗?

最佳答案

从 KieContainer 获取 KieBase 并从中创建 KieSession 对我来说很有效:

KieContainer kieContainer =
   kieServices.newKieContainer(kieServices.getRepository().getDefaultReleaseId() );
KieBase kieBase = kieContainer.getKieBase();
KieSession kieSession = kieBase.newKieSession();

但是您的代码也可以工作 - 至少在使用 Java 完成所有操作之后,并确保 Person 和 DRL 文件位于同一个包中。

String drl = "package drlstring;\n" +
    "dialect 'mvel'\n" +
    "rule Person_is_over_18\n" +
    "when\n" +
    "$person : Person(age > 18)\n" +
    "then\n" +
    "System.out.println(\"Person is \"+$person.getName());\n" +
    "end";
// setup for rule
KieServices kieServices = KieServices.Factory.get();
KieFileSystem kfs = kieServices.newKieFileSystem();
kfs.write( "src/main/resources/simple.drl",
       kieServices.getResources().newReaderResource( new StringReader(drl) ) );
KieBuilder kieBuilder = kieServices.newKieBuilder( kfs ).buildAll();

// check there have been no errors for rule setup
Results results = kieBuilder.getResults();
if( results.hasMessages( Message.Level.ERROR ) ){
    System.out.println( results.getMessages() );
    throw new IllegalStateException( "### errors ###" );
}
KieContainer kieContainer =
    kieServices.newKieContainer( kieBuilder.getKieModule().getReleaseId() );
KieSession kieSession = kieContainer.newKieSession();

// insert facts and fire rules
kieSession.insert(new Person("Jon Doe", 21));
kieSession.insert(new Person("Jon Darcy", 1));
kieSession.fireAllRules();
kieSession.dispose();

如果您想继续 Scala 设置,请通过添加具有空条件的规则来缩小无法启动的可能原因:

rule hello
when then 
  System.out.println( "Hello!" );
end

认为这是 Drools 引擎无法识别的 Person 类的 Scala 定义。

关于Drools 6 从字符串加载并执行规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34418812/

相关文章:

java - 口水融合 : measure performance

java - 基于时间运算符的累加/收集

spring - 强制 maven 到 drools-camel 的最新 Spring 版本

java - Drools 规则引擎流程

java - 为 map 中的每个元素流口水

java - 议程组在 Drools 中未按预期工作

java - Spring 3 与 Drools 6 maven 不一致

流口水改变套装

java - 使用 Sybase DB 迁移 JBPM 7.31.0 时出现问题,未找到其余 API

php - 如何将 Drools 与 PHP 应用程序一起使用?