【问题标题】:Call overloaded method from Drools: `unable to resolve method using strict-mode`从 Drools 调用重载方法:`无法使用严格模式解析方法`
【发布时间】:2015-05-05 19:43:20
【问题描述】:

我是 java 和 drools 的新手,我必须构建一个 java RESTful Web 服务/规则引擎。我们已经拥有运行 drools 5.2 版的 Genesys Rule Authoring (GRAT) 和 Genesys Rule Engine (GRE)(8.1.2 版)。我们需要获取 GRAT 包的源代码,并在我们的开发环境的“精简规则引擎”中使用它们。对于我的 POC,我已经安装了 drools 5.2 并创建了一个可以像我想要的那样消化我的包和火规则的项目。但是对于某些包我有这种错误:

BuildError: Unable to Analyse Expression $routingparams.priority = obtenirValeurParametre($routingparams.priority,"100");
$routingparams.target1 = obtenirValeurParametre($routingparams.target1, "AVGRP_GPAP_AEP_TA_MDP_E");:
[Error: unable to resolve method using strict-mode: com.desjardins.gtd.dpsccc.routage.gpap.routingparams.ObtenirValeurParametre.obtenirValeurParametre(java.lang.Integer, java.lang.String)]
[Near : {... ngparams.priority = obtenirValeurParametre($routin ....}]

如果您查看最后的包,您会看到函数 obtenirValeurParametre(String, String)。您还将看到使用 (Integer, String) 调用此函数,并且错误在此行。在 drools 包中,我不能具有不同参数的相同功能。我曾尝试使用“drools.dialect.mvel.strict”=false,但它并没有改变任何东西。

KnowledgeBuilderConfiguration kbConfig =KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration();
kbConfig.setProperty("drools.dialect.mvel.strict", "false");
System.setProperty("drools.dialect.mvel.strict", "false");
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder( kbConfig );

由于 GRE 像我一样运行 drools 5.2 并且它适用于 GRE,我认为它必须存在一个解决方案,然后添加 .toString() 或类似的东西。考虑到我们有很多包,其中一些有上千条规则,我不想对每条规则进行调整。

有人有解决这些问题的想法吗?他/她将是我的英雄!

package com.desjardins.gtd.dpsccc.routage.gpap.routingparams

import java.util.*;

function String obtenirValeurParametre(String valeurActuelle, String parametre){
    if(parametreEstVide(parametre)) return "";  
    if("*".equals(parametre)) return valeurActuelle;
    else return parametre;
}

function boolean parametreEstVide(String parametre){
    if(parametre.startsWith("{") && parametre.endsWith("}")) return true;
    else return false;
}

declare RoutingParams
    target1: String
    priority: Integer
end 

declare ContexteInteraction
    destination: String
end 

#from row number: 1
rule "Row 1 DT-6249 UNIT_Test Alain"
salience 99000 
    agenda-group "level1"
    dialect "mvel"
    when
        ContexteInteraction( destination == 'GPAP_AEP_TA_MDP')
        $routingparams:RoutingParams(); 
        $contexteInteraction:ContexteInteraction();
    then
        $routingparams.priority = obtenirValeurParametre($routingparams.priority,'100')
        $routingparams.target1 = obtenirValeurParametre($routingparams.target1, 'AVGRP_GPAP_AEP_TA_MDP_E')
end

谢谢

阿兰

【问题讨论】:

  • 你的函数签名是obtenirValeurParametre(String, String),但你试图在第一次调用中使用它,使用整数和字符串参数。
  • 你是用哪个版本开发的“千条规则”?显然,这是在规则中使用 Drools 的方式。还是你写了数千条规则却没有注意到这个问题?此外,RHS 代码不应该依赖于重要的 Java 功能(以及任何 MVEL 功能)。

标签: drools strict-mode


【解决方案1】:

任何 Drools 版本中都不能重载 DRL 函数。

解决函数问题(有更多限制)的通常解决方法是使用和导入类中的静态 Java 方法,例如:

public class Utils {
    public static String 
    obtenirValeurParametre(String valeurActuelle, String parametre){
        if(parametreEstVide(parametre)) return "";  
        return "*".equals(parametre) ? valeurActuelle : parametre;
    }

    public static String 
    obtenirValeurParametre(Integer valeurActuelle, String parametre){
        if(parametreEstVide(parametre)) return "";  
        return "*".equals(parametre) ?
               valeurActuelle.toString() : parametre;
    }

    public static boolean
    parametreEstVide(String parametre){
        return parametre.startsWith("{") && parametre.endsWith("}");
    }
}

您需要对每个 DRL 文件进行一项更改:

import static the.package.name.Utils.*;

这是个好消息。

我已经使用 5.3 版本对此进行了测试,但它在方言 MVEL 中失败,并且可以肯定地认为它不适用于 5.2(这对我来说太旧了)。 MVEL 在 5.x 开发期间被集成到 Drools 时充满了错误。不过,大量的辛勤工作使事情有所改善。

所以它可以工作,即使在 5.5 和 6.2 版本中使用方言 MVEL。您必须升级到 5.5、5.6 或 6.2。后者将意味着对用于编译和执行的 Java 代码进行一些更改。

【讨论】:

  • 我刚刚使用 5.4 版进行了测试,它工作正常。我将不得不修改每个 .drl 文件,但我认为我们可以解决这个问题。谢谢
  • 不确定 5.4 是否是最佳选择。仔细测试。
  • 我相信您的注释,DRL 函数不能重载 - 只是好奇,您是否也知道任何涵盖这一点的参考资料?谢谢。
  • @cellepo 抱歉,我已经很久很久没有在这个领域活跃了......
  • 无论如何,谢谢,这仍然很有帮助。
猜你喜欢
  • 1970-01-01
  • 2015-07-17
  • 1970-01-01
  • 1970-01-01
  • 2019-09-17
  • 1970-01-01
  • 2020-05-08
  • 2018-09-02
  • 1970-01-01
相关资源
最近更新 更多