繁体   English   中英

需要有关实施Drools规则的设计指导

[英]Need design guidance for implementing Drools rules

我在我的应用程序中使用Drools 6.1.0。

我们计划编写一个单个的.drl文件,其中将包含所有规则。

规则主要分为两类:1.空检查2.业务验证

我计划使用ruleflow-group,activation-group和salience来管理将事实添加到会话时要执行/触发的规则。

即使采用这种方法,该解决方案对我也不起作用,因为。

可以说我在.drl文件下面

rule "rule1"
ruleflow-group "primary"
activation-group "NullCheck"
salience 5
when 
    $m : Message(innerMsg.something == null)
then 
    // do something

rule "rule2"
ruleflow-group "primary"
activation-group "NullCheck"
salience 4
when 
    $m : Message(innerMsg.something.something == null)
then 
    // do something

rule "rule3"
ruleflow-group "primary"
activation-group "NullCheck"
salience 3
when 
    $m : Message(innerMsg.something.something.something == null)
then 
    // do something

Drools文档说: “插入事实时,将评估所有约束。根据Drools手册:条件评估不受特定评估序列或时间点的束缚,而是在生命周期的任何时间连续发生。引擎。”

所以发生的是正在执行该文件的代码在rule2上引发了Nullpointer异常,因为innerMsg.something.something为NULL

注意:我不想使用||合并所有空检查。 在单个when语句中,因为我想捕获特定的空条件并基于该条件创建错误消息。

我的问题如下。

  1. 使用drools规则对链接对象执行Nullchecks是一个好主意吗?
  2. 我是否应该使用其他类似顺序规则执行(不确定在Drools中是否可用)之类的东西,以允许我按特定顺序执行规则。
  3. 还有另一种方法可以实现这一目标

我认为http://drools-moved.46999.n3.nabble.com/rules-users-Drools-Activation-Group-td3546598.html可能与您看到的内容有关。 您可以尝试以下方法。

rule "rule2" ruleflow-group "primary" activation-group "NullCheck" salience 4 when $m : Message(innerMsg != null) Message(this == $m, innerMsg.something != null) Message(this == $m, innerMsg.something.something == null) then

这与您避免一堆||的愿望背道而驰。 在某种程度上,但这是一种不同的语法。

您无法避免的是使用使代码为空安全的方法。

您可以为访问条件的每个条件加上前缀,每个条件都带有带有null测试的Object子类型:

Fact( field != null && field.subfield == whatsoever )

或使用null安全解引用运算符:

Fact( field!.subfield == whatsoever )

请注意, ==!=隐式为null安全,因此您可以编写

Fact( field == whatever )

如果field == null则没有问题。

放弃使用激活组和显着性来尽快实现流控制的想法。 这将导致非常糟糕的规则设计,无法维护的代码以及普遍的不愉快感。 如果不能,请全部用Java或其他语言编写。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM