85.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(); 
1

KieContainer kc = ks.getKieClasspathContainer(); 
2

KieSession ksession = kc.newKieSession("HelloWorldKS"); 
3
Copy to Clipboard Toggle word wrap

1
获取 KieServices 工厂。这是应用程序用来与决策引擎交互的主要接口。
2
从项目类路径创建一个 KieContainer。这会检测一个 /META-INF/kmodule.xml 文件,该文件使用 KieModule 配置并实例化 KieContainer
3
根据 /META-INF/kmodule.xml 文件中定义的 "HelloWorldKS" KIE 会话配置创建一个 KieSession
注意

有关 Red Hat Process Automation Manager 项目打包的更多信息,请参阅 打包和部署 Red Hat Process Automation Manager 项目

Red Hat Process Automation Manager 有一个事件模型,可公开内部引擎活动。两个默认调试监听程序 DebugAgendaEventListenerDebugRuleRuntimeEventListener,将调试事件信息输出到 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 );
Copy to Clipboard Toggle word wrap

日志记录器是在 AgendaRuleRuntime 侦听程序基础上构建的专用实现。当决策引擎完成执行后,会调用 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();
Copy to Clipboard Toggle word wrap

规则执行使用数据模型将数据作为输入并输出到 KieSession。本例中的数据模型有两个字段: 消息,即 String,可以是 HELLOGOODBYE

数据模型类

public static class Message {
    public static final int HELLO   = 0;
    public static final int GOODBYE = 1;

    private String          message;
    private int             status;
    ...
}
Copy to Clipboard Toggle word wrap

这两个规则位于 src/main/resources/org/drools/examples/HelloWorld.drl 文件中。

"Hello World" 规则的 when 条件指出每个 Message 对象的规则被激活到 KIE 会话中,其状态为 Message.HELLO。此外,还创建两个变量绑定:变量 消息 绑定到 message 属性,变量 m 绑定到匹配的 Message 对象本身。

规则的 then 操作指定将绑定变量 消息 的内容输出到 System.out,然后更改绑定到 mMessage 对象 的消息 和状态 属性。规则使用 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
Copy to Clipboard Toggle word wrap

"Good Bye" 规则类似于 "Hello World" 规则,但它与状态为 Message.GOODBYE 的 Message 对象匹配。

"good Bye" 规则

rule "Good Bye"
  when
    Message( status == Message.GOODBYE, message : message )
  then
    System.out.println( message );
end
Copy to Clipboard Toggle word wrap

要执行示例,请在 IDE 中作为 Java 应用程序运行 org.drools.examples.helloworld.HelloWorldExample 类。规则写入 System.out,调试侦听器写入 System.err,审计日志记录器会在 target/ the.log 中创建一个日志文件

IDE 控制台中的 system.out 输出

Hello World
Goodbye cruel world
Copy to Clipboard Toggle word wrap

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]
Copy to Clipboard Toggle word wrap

为更好地了解本例的执行流程,您可以将审计日志文件从 target/helloworld.log 加载到 IDE debug 视图或 审计 视图(例如,在一些 IDE 中的 Window Show View 中)。

在本例中,审计视图显示 插入了对象,它为 "Hello World" 规则创建一个激活。然后执行激活,它会更新 Message 对象,并导致 "Good Bye" 规则激活。最后,执行 "Good Bye" 规则。当您在 Audit View 中选择一个事件时,原始事件(本例中为 "Activation created" 事件)以绿色形式突出显示。

图 85.3. hello World 示例审计视图

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat