当前位置: 首页 > 知识库问答 >
问题:

Drools规则语言:规则不总是激发

韦俊英
2023-03-14

我是Drools Fusion的新手,我想知道为什么我的规则不总是被取消。我用的是Drools 6.3。以下是我要插入的事件:

    private static void initMessageObject() {
    SessionPseudoClock clock = ksession.getSessionClock();

    hellodrools2.AppInfo app = new hellodrools2.AppInfo();
    entryPoint1.insert(app);
    System.out.println(app);

    Steps step1 = new Steps(25, 0);
    entryPoint1.insert(step1);

    clock.advanceTime(30, TimeUnit.MINUTES);

    Steps step2 = new Steps(15, 0);
    entryPoint1.insert(step2);

    clock.advanceTime(15, TimeUnit.MINUTES);

    Steps step3 = new Steps(25, 0);
    entryPoint1.insert(step3);

    try {
        System.err.println("[[ Sleeping ...]]");
        Thread.sleep(5000);
    } catch (final InterruptedException e) {
        e.printStackTrace();
    }
    System.err.println("[[ awake ...]]");

    ksession.halt();
    ksession.dispose();
}

这是我的规则文件:

import hellodrools.Steps
import hellodrools.AppInfo

declare Steps
    @role(event)
end

rule "STEPS RULE"
when
    $totalSteps : Number( doubleValue < 50 ) from accumulate(
        Steps( stepsCount : steps ) over window:time( 1h ) from entry-point
       entryone, sum( stepsCount ) )
then
    System.out.println("STEPS RULE: get moving!");
    System.out.println($totalSteps);
end

这是我的输出:

AppInfo{startTime=Sat Feb 27 21:30:42 CET 2016}
[[ Sleeping ...]]
STEPS RULE: get moving!
0.0
[[ awake ...]]

我预计我的规则将触发2次,并给出以下输出:

AppInfo{startTime=Sat Feb 27 21:30:42 CET 2016}
[[ Sleeping ...]]
STEPS RULE: get moving!
25.0
STEPS RULE: get moving!
40.0
[[ awake ...]]

我可能忽略了一些事情,但我没有找到关于我的问题的太多信息。有人能解释一下这里到底发生了什么吗?非常感谢。

共有1个答案

宁欣怿
2023-03-14

使用Drools运行事件处理有两种好方法

一种是在线程中运行会话,调用fire UntilHalt,同时使用实时时钟。在生产模式下,事件将到达并被插入;对于测试,使用运行脚本的线程进行模拟,以插入事件事实并暂停以让实时流逝(已将分钟替换为秒)。

另一个非常适合测试,使用伪时钟和事件事实序列及其时间戳(单独或作为属性),执行三元组

clock.advance( ...event.timestamp - clock.getCurrentTime()... );
wmep.insert( event );
ksession.fireAllRules();

对每个事件重复。这应该适用于5.5及更高版本,产生您期望的结果。

 类似资料:
  • 我是一个流口水的新手(6.3版),我很难想出一个具体的规则。我有一个名为Steps的类,只有一个简单的字段

  • 我对drools和KIE服务器是新手。我遇到了一个问题,即如何通过触发规则RHS(then action)在工作记忆中插入新的事实,然后通过这些动态插入的事实激活其他规则。 我所期望的是,当BaseFeature从外部插入工作内存并激活RuleOne时,在RuleOne内部“然后”它将插入新的事实RuleResult,并希望激活RuleTwo,但它没有激活RuleTwo,只是RuleOne被激活了

  • 我有两个事实,分别命名为OptionalCover和OptionalPremiumComponent,其中有OptionalPremiumComponent的参考。这就是我在工作记忆中插入的内容。 我在drools中创建了以下规则 问题是,插入父对象时没有触发上述规则。我还需要做些什么来实现这种行为吗?是否支持? 谢谢你。

  • 我的问题是: 在Drools规则中,有没有一种方法可以拦截“成功”事件?为了更好地解释。。。有一种方法可以在规则的所有条件都为真时调用侦听器? 注意:我不想设置一个全局对象(在会话上)来管理规则的“然后”子句中的这个条件。 我正在寻找一个已经在Drools上实现的解决方案 规则示例