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

实施Drools规则需要设计指导

金昌胤
2023-03-14

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

我们正计划写一本巨著。包含所有规则的drl文件。

主要有两类规则1。空检查2。业务验证

使用规则流组、激活组和显著性,我计划在将事实添加到会话时管理要执行/触发的规则。

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

假设我有以下内容。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上抛出空指针异常,因为innerMsg.something.something为NULL

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

我的问题如下。

  1. 使用drools规则对链接对象进行Nullcheck是个好主意吗?
  2. 我是否应该使用其他东西,例如顺序规则执行(不确定Drools中是否可用),这将允许我按特定顺序执行规则。
  3. 有没有别的方法可以实现这一点

共有2个答案

孟浩然
2023-03-14

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

<代码>规则“rule2”规则流组“primary”激活组“NullCheck”显著性4当$m时:消息(innerMsg!=null)消息(this==$m,innerMsg.something!=null)消息(this==$m,innerMsg.something.something==null),然后

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

赵智
2023-03-14

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

您可以在访问字段的每个条件前面加上带有空测试的对象子类型的前缀:

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

或者您使用空安全取消引用运算符:

Fact( field!.subfield == whatsoever )

请注意,=== 是隐式空安全的,因此您可以编写

Fact( field == whatever )

如果field==null没有问题。

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

 类似资料:
  • 我最近开始研究口水。我只是设计了一个简单的应用程序来更好地理解它。 谢谢。

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

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

  • 使用指南 - 统计设置 - 统计规则设置 为您详细介绍百度统计所支持的各种设置功能及使用方法,比如设置排除规则、设置跨域、添加指定广告追踪、设置转化目标等。 统计规则设置 什么是统计规则 如何设置跨域监控 跨域跟踪的用途举例 多域名网站的跨域跟踪 排除特定域名来源的访问流量 排除特定域名的访问流量 排除特定IP的访问流量 子目录介绍及设置方法 统一页面地址功能介绍

  • 我正在向drools规则引擎插入数据,但我无法理解它是如何处理插入的数据的。插入数据的代码是: