2015-05-05 18 views
1

我是java和drools的新手,我必須構建一個java REST風格的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(字符串,字符串)。你也會看到這個函數調用(整數,字符串),錯誤在這一行。在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運行口水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 

感謝

阿蘭

+0

您的函數singnature是'obtenirValeurParametre(String,String)',但您試圖在第一次調用Integer和String params時使用它。 – kaskelotti

+0

你開發了哪些版本的「成千上萬的規則」?顯然這是按照你的規則使用Drools的方法。還是你寫了成千上萬的規則,卻沒有注意到這個問題?而且,RHS代碼不應該依賴非平凡的Java特性(以及任何MVEL特性)。 – laune

回答

3

重載一個DRL功能是不可能的任何 Drools的版本。

通常的解決方法問題的功能(有更多的限制)是使用從一類進口靜態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開發期間,MVEL被集成到Drools中時充滿了錯誤。不過,大量的努力改善了事情。

即使在版本5.5和6.2中使用方言MVEL,它也能正常工作。你必須升級到5.5,5.6或6.2。後者將意味着對Java代碼進行編譯和執行的一些更改。

+0

我剛剛使用版本5.4進行測試,它工作正常。我將不得不修改每個.drl文件,但我認爲我們可以處理。感謝 –

+0

不確定5.4是否是最佳選擇。仔細測試。 – laune