19.2. hello World 示例决策(基本规则和调试)
Hello World 示例决策演示了如何将对象插入到决策引擎工作内存中,如何使用规则匹配对象,以及如何配置日志记录来跟踪决策引擎的内部活动。
以下是 Hello World 示例的概述:
-
名称 :
helloworld -
主类 :
org.drools.examples.novncproxy.HelloWorldExample(在src/main/java中) -
模块 :
drools-examples - 类型 :Java 应用程序
-
规则文件:
org.drools.examples.novncproxy.HelloWorld.drl(在src/main/resources中) - 目标 :演示基本规则执行和使用 debug 输出
在 Hello World 示例中,生成 KIE 会话来启用规则执行。所有规则都需要一个 KIE 会话才能执行。
用于规则执行的 KIE 会话
KieServices ks = KieServices.Factory.get();
KieContainer kc = ks.getKieClasspathContainer();
KieSession ksession = kc.newKieSession("HelloWorldKS");
有关 Red Hat Process Automation Manager 项目打包的更多信息,请参阅 打包和部署 Red Hat Process Automation Manager 项目。
Red Hat Process Automation Manager 有一个事件模型,可公开内部引擎活动。两个默认调试监听程序 DebugAgendaEventListener 和 DebugRuleRuntimeEventListener,将调试事件信息输出到 System.err 输出中。KieRuntimeLogger 提供执行审核,您可以在图形查看的结果。
调试监听程序和审计日志记录程序
// Set up listeners.
ksession.addEventListener( new DebugAgendaEventListener() );
ksession.addEventListener( new DebugRuleRuntimeEventListener() );
// Set up a file-based audit logger.
KieRuntimeLogger logger = KieServices.get().getLoggers().newFileLogger( ksession, "./target/helloworld" );
// Set up a ThreadedFileLogger so that the audit view reflects events while debugging.
KieRuntimeLogger logger = ks.getLoggers().newThreadedFileLogger( ksession, "./target/helloworld", 1000 );
日志记录器是在 Agenda 和 RuleRuntime 侦听程序基础上构建的专用实现。当决策引擎完成执行后,会调用 logger.close ()。
该示例创建含有消息 "Hello World" 的单个 Message 对象,将状态 HELLO 插入到 KieSession 中,执行带有 fireAllRules () 的规则。
数据插入和执行
// Insert facts into the KIE session.
final Message message = new Message();
message.setMessage( "Hello World" );
message.setStatus( Message.HELLO );
ksession.insert( message );
// Fire the rules.
ksession.fireAllRules();
规则执行使用数据模型将数据作为输入并输出到 KieSession。本例中的数据模型有两个字段: 消息,即 String,可以是 HELLO 或 GOODBYE。
数据模型类
public static class Message {
public static final int HELLO = 0;
public static final int GOODBYE = 1;
private String message;
private int status;
...
}
这两个规则位于 src/main/resources/org/drools/examples/HelloWorld.drl 文件中。
"Hello World" 规则的 when 条件指出每个 Message 对象的规则被激活到 KIE 会话中,其状态为 Message.HELLO。此外,还创建两个变量绑定:变量 消息 绑定到 message 属性,变量 m 绑定到匹配的 Message 对象本身。
规则的 then 操作指定将绑定变量 消息 的内容输出到 System.out,然后更改绑定到 m 的 Message 对象 的消息 和状态 属性。规则使用 modify 语句在一个语句中应用分配块,并在块末尾通知决策引擎更改。
"hello World" 规则
rule "Hello World"
when
m : Message( status == Message.HELLO, message : message )
then
System.out.println( message );
modify ( m ) { message = "Goodbye cruel world",
status = Message.GOODBYE };
end
"Good Bye" 规则类似于 "Hello World" 规则,但它与状态为 的 Message 对象匹配。
Message.GOODBYE
"good Bye" 规则
rule "Good Bye"
when
Message( status == Message.GOODBYE, message : message )
then
System.out.println( message );
end
要执行示例,请在 IDE 中作为 Java 应用程序运行 org.drools.examples.helloworld.HelloWorldExample 类。规则写入 System.out,调试侦听器写入 System.err,审计日志记录器会在 target/ the.log 中创建一个日志文件。
IDE 控制台中的 system.out 输出
Hello World
Goodbye cruel world
IDE 控制台中的 system.err 输出
==>[ActivationCreated(0): rule=Hello World;
tuple=[fid:1:1:org.drools.examples.helloworld.HelloWorldExample$Message@17cec96]]
[ObjectInserted: handle=[fid:1:1:org.drools.examples.helloworld.HelloWorldExample$Message@17cec96];
object=org.drools.examples.helloworld.HelloWorldExample$Message@17cec96]
[BeforeActivationFired: rule=Hello World;
tuple=[fid:1:1:org.drools.examples.helloworld.HelloWorldExample$Message@17cec96]]
==>[ActivationCreated(4): rule=Good Bye;
tuple=[fid:1:2:org.drools.examples.helloworld.HelloWorldExample$Message@17cec96]]
[ObjectUpdated: handle=[fid:1:2:org.drools.examples.helloworld.HelloWorldExample$Message@17cec96];
old_object=org.drools.examples.helloworld.HelloWorldExample$Message@17cec96;
new_object=org.drools.examples.helloworld.HelloWorldExample$Message@17cec96]
[AfterActivationFired(0): rule=Hello World]
[BeforeActivationFired: rule=Good Bye;
tuple=[fid:1:2:org.drools.examples.helloworld.HelloWorldExample$Message@17cec96]]
[AfterActivationFired(4): rule=Good Bye]
为更好地了解本例的执行流程,您可以将审计日志文件从 target/helloworld.log 加载到 IDE debug 视图或 审计 视图(例如,在一些 IDE 中的 Window
在本例中,审计视图显示 插入了对象,它为 "Hello World" 规则创建一个激活。然后执行激活,它会更新 Message 对象,并导致 "Good Bye" 规则激活。最后,执行 "Good Bye" 规则。当您在 Audit View 中选择一个事件时,原始事件(本例中为 "Activation created" 事件)以绿色形式突出显示。
图 19.3. hello World 示例审计视图