我设置了一个非常基本的 drools 规则引擎,仅插入了规则:
rule "Hello World"
when
then
System.out.println("Hello World!");
end
我正在 Java 线程运行循环中运行该应用程序。循环的每次迭代我都会触发所有规则(使用有状态的 Kie 会话)。循环的第一次迭代产生“Hello World!”报表打印成功。但是,此后该规则不会再次触发。
这是运行函数:
@Override
public void run() {
// Fire the rules
System.out.println("Firing rules");
kSession.fireAllRules();
}
这是我初始化 Kie 会话的方法:
KieServices ks = KieServices.Factory.get();
KieContainer kContainer = ks.getKieClasspathContainer();
KieBase kBase1 = kContainer.getKieBase("KBase1");
kSession = kBase1.newKieSession();
这是为什么呢?我猜测这与应用程序完成的推断有关,但我在概念上对引擎的了解还不足以了解。
我正在使用 Maven 并具有以下依赖项:
我还使用以下插件:
提前致谢!
规则由 InitalFactImpl 激活。
让我们考虑这样一种情况:当我们的会话中没有任何可疑操作时,无论InitalFactImpl事实是一个特殊的事实,始终存在于 PHREAK 网络中(但并不总是使用)。每次创建新的 KIE 会话时,都会自动将 InitalFactImpl 插入其中。这将允许评估诸如 not 条件元素之类的模式...
客户如何,我们都希望执行规则。该规则将写成如下:
rule "Sample Rule 1"
when
not (SuspiciousOperation())
then
channels["audit-channel"].send("OK");
end
对于本例,使用 InitalFactImpl 是因为我们没有任何可以触发规则的事实。
来源:掌握 JBoss Drools 6(Mauricio Salatino、Mariano De Maio、Esteban Aliverti )