无法使用严格模式

时间:2015-05-05 19:43:20

标签: drools strict-mode

我是java和drools的新手,我必须构建一个java RESTful Web服务/规则引擎。我们已经有运行drools版本5.2的Genesys Rule Authoring(GRAT)和Genesys Rule Engine(GRE)(版本8.1.2)。我们需要获取GRAT包的来源,并将它们用于我们开发环境的“lite规则引擎”中。对于我的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

由于

阿兰

1 个答案:

答案 0 :(得分:4)

任何 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(这对我来说太老了)。当在5.x开发期间集成到Drools中时,MVEL充满了错误。尽管如此,大量艰苦的工作改善了事情。

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