【问题标题】:Drools - Not all actions are executed when rule firesDrools - 规则触发时并非所有操作都会执行
【发布时间】:2016-11-29 08:38:39
【问题描述】:

目前,我有一个包含很多条件/操作的大型决策表。决策表一直有效,直到我最近添加了一个新操作。它似乎没有执行。

由于我无法显示整个文件,因此这是最重要的列的摘录(请注意,还有更多条件):

以下是在“orig”对象上定义的操作:

以下字段通过setter更新:

  • PRM_LIB01
  • PRM_LIB09
  • PRM_LIB10

但是,PRM_LIB18 并未更新。即使我切换 PRM_LIB10 和 PRM_LIB18 的操作,也只有 PRM_LIB10 的列得到更新。

当我调试代码时,我看到 RuleBuildContext 包含第一条规则的所有设置器:

因此,基于此,我希望它也会执行 setPRM_LIB18("GC"),但这不会发生。

然后我尝试查看 Drools 实际生成的类文件,看看是否一切正常,但我无法正确查看生成的字节码。

我真的不知道为什么它不起作用。有没有人有线索或者我可以如何调试操作的实际调用以查看它为什么没有被执行?

【问题讨论】:

  • 您确定您的其他操作没有干扰吗?例如,blankOutPremiumFreeFields(orig) 在做什么?

标签: java drools


【解决方案1】:

这不太可能。你如何确定这个动作没有被执行?是否有其他规则也可能修改 PRM_LIB18?

为了快速调试,添加另一个包含已修改对象的打印输出的操作列 - 至少是修改后的字段。

如果您仍然没有任何线索,请尝试此代码并报告完整/截断的基本输出。

private void testSpreadsheet(){
  File dtf = new File( dtPath );
  InputStream is;
  try {
    is = new FileInputStream( dtf );
    SpreadsheetCompiler ssComp = new SpreadsheetCompiler();
    String s = ssComp.compile( is, InputType.XLS );
    System.out.println( "=== Begin generated DRL ===" );
    System.out.println( s );
    System.out.println( "=== End generated DRL ===" );
  } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
  }
}

【讨论】:

    猜你喜欢
    • 2015-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-25
    • 1970-01-01
    • 1970-01-01
    • 2018-01-04
    相关资源
    最近更新 更多