89.2. hello World 示例决策(基本规则和调试)


Hello World 示例决策集演示了如何将对象插入到决策引擎工作内存中,如何使用规则匹配对象,以及如何配置日志记录以跟踪决策引擎的内部活动。

以下是 Hello World 示例的概述:

  • 名称helloworld
  • 主要课程:org.drools.examples.helloworld.HelloWorldExample (在 src/main/java中)
  • 模块drools-examples
  • 键入: Java 应用程序
  • 规则文件org.drools.examples.helloworld.HelloWorld.drl ( src/main/resources)
  • 目标 :演示基本规则执行和使用调试输出

在 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 Decision Manager 项目打包的更多信息,请参阅 打包和部署 Red Hat Decision Manager 项目

Red Hat Decision 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 对象,将 status 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/helloworld/helloworld/HelloWorld.drl 文件中。

"Hello World" 规则的 when 条件指出,针对插入到 KIE 会话的每个 Message 对象激活规则,其具有 status 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 对象匹配。

"好"规则

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

要执行示例,请在 IDE 中将 org.drools.examples.helloworld.HelloWorldExample 类作为 Java 应用程序运行。该规则会写入到 System.out,debug 侦听器写入 System.err,审计日志记录器 在目标/helloworld.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 调试视图或 Audit View (例如,如果可用)。

在本例中,audit 视图显示 对象已插入,这将为 "Hello World" 规则创建一个激活。然后执行激活,它会更新 Message 对象并导致 "Good Bye" 规则激活。最后,执行 "Good Bye" 规则。当您在 Audit View 中选择一个事件时,origin 事件(此示例中是 "创建的" 事件)将以绿色突出显示。

图 89.3. hello World 示例 Audit 视图

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat