Drools 6 从字符串加载和执行规则
Drools 6 loading and executing rule from String
我正在尝试从 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
}
我想要的是打印出人名。通过附加 eventlistener 和 logger,我可以看到事实已添加并断言。通过在 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 引擎无法识别 class Person 的 Scala 定义。
我正在尝试从 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
}
我想要的是打印出人名。通过附加 eventlistener 和 logger,我可以看到事实已添加并断言。通过在 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 引擎无法识别 class Person 的 Scala 定义。