2015-05-05 4 views
1

Я новичок с java и drools, и мне нужно создать java RESTful Web Services/rules engine. У нас уже есть Genesys Rule Authoring (GRAT) и Genesys Rule Engine (GRE) (версия 8.1.2), которые запускают drools версии 5.2. У нас есть необходимость взять источник пакетов GRAT и использовать их в «Lite rule engine» для наших сред разработки. Для моего 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 запустить течет слюна 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. – 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("}"); 
    } 
} 

Вам нужно одно изменение за ДРЛ файла:

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

Это была хорошая новость.

Я тестировал это с использованием версий 5.3, и он терпит неудачу с диалектом MVEL, и можно с уверенностью предположить, что он не будет работать с 5.2 (что для меня слишком устарело). MVEL была полна ошибок при интеграции в Drools во время разработки 5.x. Тем не менее, многие трудолюбивые работы улучшили ситуацию.

И так работает, даже с диалектом MVEL в версиях 5.5 и 6.2. Вам нужно будет обновить до 5.5, 5.6 или 6.2. Последнее будет означать некоторые изменения в Java-коде для компиляции и выполнения.

+0

Я только что проверил, используя версию 5.4, и он отлично работает. Мне нужно будет изменить каждый .drl-файл, но я думаю, что с этим мы справимся. Thank –

+0

Не уверен, является ли 5.4 лучшим выбором. Тщательно проверьте. – laune