85.7. honest Politician 示例决策(非维护和风险)


Honest Politician 示例决定集演示了通过逻辑插入以及规则中的 salience 使用的真实维护的概念。

以下是 Honest Politician 示例的概述:

  • 名称:honestpolitician
  • 主类org.drools.examples.honestpolitician.HonestPoliticianExample (在 src/main/java中)
  • 模块drools-examples
  • 类型 :Java 应用程序
  • 规则文件:org.drools.examples.honestpolitician.HonestPolitician.drl (在 src/main/resources中)
  • 目标 :根据事实的逻辑插入和规则的使用,说明事实中的事实概念

Honest Politician 示例的基本内部是,只有语句为 true 时对象才能存在。规则结果可以在逻辑上插入带有 insertLogical () 方法的对象。这意味着,只要逻辑插入的规则保持在 KIE 会话工作内存中,对象仍保持在 KIE 会话工作内存中。当不再满足该规则时,对象会自动重新遍历。

在本例中,执行规则会导致一组 politicians 从 honest 变为 dishonest,从而导致一个被破坏的攻击。评估每个 politician 后,它们从设为 true 的 honesty 属性开始,但一条规则会触发使 politicians 不再休眠的规则。当它们的状态从 honest 切换到 dishonest 时,它们会被从工作内存中移除。规则 salience 通知决策引擎如何优先选择为它们定义了差异的任何规则,否则使用默认的 salience 值 0。在激活队列中排序时,具有较高 salience 值的规则会被赋予更高的优先级。

Politician 和 Hope 类

示例中的 Politician 示例是为 honest politician 配置的示例。Politician 类由 String 项 名称和 一个布尔值项组成:

Politician 类

public class Politician {
    private String name;
    private boolean honest;
    ...
}
Copy to Clipboard Toggle word wrap

Hope 类确定 Hope 对象是否存在。这类没有有意义的成员,但只要这个要求,就存在于工作内存中。

期望类

public class Hope {

    public Hope() {

    }
  }
Copy to Clipboard Toggle word wrap

politician honesty 的规则定义

在 Honest Politician 示例中,当工作内存中至少有一个 honest politician 时,"We 有一个 honest Politician" 规则逻辑插入一个新的 Hope 对象。当所有策略都变为 dishonest 后,H ope 对象会自动重新遍历。此规则具有值 10salience 属性,以确保它在任何其他规则之前触发,因为该阶段 "Hope 是 Dead" 规则为 true。

规则 "We 有一个 honest politician"

rule "We have an honest Politician"
    salience 10
  when
    exists( Politician( honest == true ) )
  then
    insertLogical( new Hope() );
end
Copy to Clipboard Toggle word wrap

一旦存在 Hope 对象,"Hope Lives" 规则会匹配并触发。此规则也具有 10salience 值,因此它优先于 "Conest" 规则。

规则"Hope Lives"

rule "Hope Lives"
    salience 10
  when
    exists( Hope() )
  then
    System.out.println("Hurrah!!! Democracy Lives");
end
Copy to Clipboard Toggle word wrap

最初,四个 honest politicians 存在,因此此规则有四个激活,它们都存在冲突。每个规则依次触发,破坏每个策略,使它们不再被休眠。当所有四个 politician 都损坏时,没有 politicians 属性 honest == true。规则 "We have a honest Politician" 不再为 true,其逻辑插入的对象(由于上次执行 新 Hope ())将自动重新遍历。

规则"Corrupt the Honest"

rule "Corrupt the Honest"
  when
    politician : Politician( honest == true )
    exists( Hope() )
  then
    System.out.println( "I'm an evil corporation and I have corrupted " + politician.getName() );
    modify ( politician ) { honest = false };
end
Copy to Clipboard Toggle word wrap

使用 Hope 对象会自动重新遍历事实维护系统,不适用于 Hope 的 condition 元素不再为 true,因此 "Hope 是 Dead" 规则匹配并触发。

规则"Hope 是 Dead"

rule "Hope is Dead"
  when
    not( Hope() )
  then
    System.out.println( "We are all Doomed!!! Democracy is Dead" );
end
Copy to Clipboard Toggle word wrap

执行和审核跟踪示例

HonestPoliticianExample.java 类中,会插入四个 politicians,并将 honest 状态设置为 true,以针对定义的自定义规则进行评估:

HonestPoliticianExample.java class execution

public static void execute( KieContainer kc ) {
        KieSession ksession = kc.newKieSession("HonestPoliticianKS");

        final Politician p1 = new Politician( "President of Umpa Lumpa", true );
        final Politician p2 = new Politician( "Prime Minster of Cheeseland", true );
        final Politician p3 = new Politician( "Tsar of Pringapopaloo", true );
        final Politician p4 = new Politician( "Omnipotence Om", true );

        ksession.insert( p1 );
        ksession.insert( p2 );
        ksession.insert( p3 );
        ksession.insert( p4 );

        ksession.fireAllRules();

        ksession.dispose();
    }
Copy to Clipboard Toggle word wrap

要执行示例,请在 IDE 中作为 Java 应用程序运行 org.drools.examples.honestpolitician.HonestPoliticianExample 类。

执行后,以下输出会出现在 IDE 控制台窗口中:

IDE 控制台中的执行输出

Hurrah!!! Democracy Lives
I'm an evil corporation and I have corrupted President of Umpa Lumpa
I'm an evil corporation and I have corrupted Prime Minster of Cheeseland
I'm an evil corporation and I have corrupted Tsar of Pringapopaloo
I'm an evil corporation and I have corrupted Omnipotence Om
We are all Doomed!!! Democracy is Dead
Copy to Clipboard Toggle word wrap

输出显示,尽管至少有一个 honest politician democracy lives。但是,由于每个 politician 都被一些公司损坏,所有策略都会变得不当,并且 democracy 都被死。

要更好地了解本例的执行流程,您可以修改 HonestPoliticianExample.java 类,使其包含 DebugRuleRuntimeEventListener 侦听器和一个审核日志记录器来查看执行详情:

带有审计日志记录器的 HonestPoliticianExample.java 类

package org.drools.examples.honestpolitician;

import org.kie.api.KieServices;
import org.kie.api.event.rule.DebugAgendaEventListener; 
1

import org.kie.api.event.rule.DebugRuleRuntimeEventListener;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;

public class HonestPoliticianExample {

    /**
     * @param args
     */
    public static void main(final String[] args) {
    	KieServices ks = KieServices.Factory.get(); 
2

    	//ks = KieServices.Factory.get();
        KieContainer kc = KieServices.Factory.get().getKieClasspathContainer();
        System.out.println(kc.verify().getMessages().toString());
        //execute( kc );
        execute( ks, kc); 
3

    }

    public static void execute( KieServices ks, KieContainer kc ) { 
4

        KieSession ksession = kc.newKieSession("HonestPoliticianKS");

        final Politician p1 = new Politician( "President of Umpa Lumpa", true );
        final Politician p2 = new Politician( "Prime Minster of Cheeseland", true );
        final Politician p3 = new Politician( "Tsar of Pringapopaloo", true );
        final Politician p4 = new Politician( "Omnipotence Om", true );

        ksession.insert( p1 );
        ksession.insert( p2 );
        ksession.insert( p3 );
        ksession.insert( p4 );

        // The application can also setup listeners 
5

        ksession.addEventListener( new DebugAgendaEventListener() );
        ksession.addEventListener( new DebugRuleRuntimeEventListener() );

        // Set up a file-based audit logger.
        ks.getLoggers().newFileLogger( ksession, "./target/honestpolitician" ); 
6


        ksession.fireAllRules();

        ksession.dispose();
    }

}
Copy to Clipboard Toggle word wrap

1
在导入处理 DebugAgendaEventListenerDebugRuleRuntimeEventListener的软件包中添加
2
创建一个 KieServices Factoryks 元素来生成日志,因为此审计日志在 KieContainer 级别不可用
3
修改 execute 方法,以使用 KieServicesKieContainer
4
除了 KieContainer外,修改在 KieServices 中传递的 execute 方法
5
创建监听程序
6
构建在执行规则后可传递给 debug 视图或 审计 视图或 IDE 的日志

当您使用此修改后的日志记录功能运行 Honest Politician 时,您可以将 target/honestpolitician.log 中的审计日志文件加载到 IDE 调试视图或 审计 视图(例如,在一些 IDE 中显示 窗口 Show View )。

在本例中,审计视图显示 执行流、插入和重新加载actions,如示例类和规则中定义的:

图 85.18. honest Politician 示例审计视图

插入第一个 politician 时,会发生两个激活。规则 "We 有一个 honest Politician" 首次插入的 politician 激活一次,因为它使用 exists 条件元素,它在插入至少一个 politician 时匹配。规则 "Hope is Dead" 也在这个阶段激活,因为 Hope 对象还没有插入。规则 "We 有一个 honest Politician" 触发,因为它具有高于规则 "Hope is Dead"salience 值,并插入 Hope 对象(以绿色表示)。Hope 对象的插入激活规则 "Hope Lives",并取消激活规则 "Hope is Dead "。插入还会激活每个插入的 honest politician 的规则 "Corrupt the Honest "。规则 "Hope Lives" 被执行并打印 "Hurrah!!!Democracy Lives"

接下来,对于每个策略,规则 "Corrupt the Honest" 触发,打印 "I'm a evil certification and I have damage X ",其中 X 是 politician 的名称,并将 politician honesty 值改为 false。当最后一个 honest politician 损坏时,H ope 会自动被事实维护系统(在蓝色中高)。绿色突出显示区域显示当前选定的蓝色突出显示区域的来源。重新遍历 Hope 事实后,规则 "Hope is dead" 会触发,打印 "We is all Doomed!!!!!!!Democracy 是 Dead"

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat