java - Drools 规则语言 : rule not always fired

标签 java drools drools-fusion

我是 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 ...]]

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

最佳答案

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

一种是在线程中运行 session ,调用 fireUntilHalt,同时使用实时时钟。在生产模式下,事件将到达并被插入;为了进行测试,使用运行脚本的线程进行模拟,以插入事件事实并暂停以让实时时间过去(已将分钟替换为秒)。

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

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

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

关于java - Drools 规则语言 : rule not always fired,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35675236/

相关文章:

java - 如何区分 Ajax 请求和普通的 Http 请求?

java - 对象/实例问题?

Drools : Tool for generating . drl 文件或基于 XML 的规则内容

java - 口水融合 : measure performance

java - Hbase客户端扫描程序挂起

java - 使用 HornetQ 强制消息顺序

javascript - JavaScript 中的规则引擎

drools - 属性访问问题

java - 从累积函数或规则代码访问 drools session 时钟