мой набор правил слюни работает бесконечно при обновлении с 7.0.0.Final до 7.8.0.Final Любая идея, что изменилось, что могло вызвать это? - PullRequest
0 голосов
/ 09 июля 2020

При тестировании нового правила, использующего функцию java 8 потоков для сортировки и фильтрации, у меня возникли проблемы с получением правил для компиляции, поэтому я решил обновить текущую версию слюни 7.0.0.Final до 7.36. 1.Финал. Когда я это сделаю, мой набор правил, который отлично работал в предыдущей версии, теперь работает бесконечно в этой версии (7.36.1). Пробуя более ранние версии между 7.0.0 и 7.36.1, я вижу, что они работают нормально до версии 7.8.0, где начинается бесконечное l oop. Даже в этом случае я могу сузить его до правил, используя функции аккумулятора, которые вызывают бесконечное l oop в 7.8.0, как только я удалю правила с помощью функций аккумулятора, остальные будут выполняться нормально. Но даже в версии 7.36.1, без правил аккумуляторов, я вижу, что некоторые другие правила теперь работают бесконечно. никаких исключений, просто рекурсивное выполнение правил. любые подсказки / идеи о том, какое изменение функции могло вызвать это ??

@ RoddyoftheFrozenPeas, извините за задержку с ответом здесь. Я вставил ниже образец кода первой проблемы. Я заметил, что бесконечное l oop происходит при обновлении с 7.7.0 до 7.8.0 (я пробовал каждую версию по очереди, пока не перешел к первой версии между 7.0.0 и 7.36. 1, который начал вызывать бесконечное l oop), а до 7.7.0 мой код работает без бесконечного l oop. В 7.8.0 правила накопления, которые у меня есть, работают в бесконечном l oop. если я удалю правила аккумулятора, остальные мои правила будут выполняться без бесконечного l oop. Но опять же, когда я перешел с версии 7.8.0 на 7.36.1, я заметил, что некоторые другие правила начали работать бесконечно. (Примечание: в моих правилах для LHS и RHS я проверяю и обновляю одно и то же свойство для тестируемых объектов).

rule "rule_1" salience -5
  no-loop true
  dialect "mvel"
  when
    $emp: Employee(!hasPropKey("projectCount") && ($emp instanceof Contractor)) @watch(props) $count: Number() from accumulate($entity: Project(members.contains($emp) && hasProp("id") && hasProp("paidHours", "true"), $projectCount : getValue('id')) @watch(props), count($projectCount))
  then
    modify($emp) { applyProp("projectCount",$count )}
end

rule "rule_2" salience -5
  no-loop true
  dialect "mvel"
  when
    $emp: Employee(!hasPropKey("totalProjectPaidHours") && ($emp instanceof Contractor)) @watch(props) $totalHours: Number() from accumulate($entity: Project(members.contains($emp) && hasProp("paidHours"), $projectHours: getValue('paidHours')) @watch(props), sum($projectHours))
  then
    modify($emp) { applyProp("totalProjectPaidHours",$totalHours)}
end

rule "rule_3" salience -5
  no-loop true
  dialect "mvel"
  when
    $emp: Employee(!hasProp("loggedProjectHours") && ($emp instanceof Contractor) @watch(props) $count: Number() from accumulate($entity: Project(members.contains($emp) && hasProp("loggedHours"), $loggedHours: getValue(' loggedHours')) @watch(props), count($loggedHours))
  then
    modify($emp) { applyProp("loggedProjectHours",$count )}
end
public class Employee {

    private String id;
    private String name;
    private Map<String, List<String>> props;

public boolean hasProp(String key, String value) {
        return props.containsKey(key) && props.get(key).contains(value);
    }

public boolean hasPropKey(String key) {
        return props.containsKey(key);
    }
    
public Number getValue(String key) throws NumberFormatException {

try {
            return props.get(key) != null && ! props.get(key).isEmpty() ? Long.parseLong(props.get(key).iterator().next()) : 0;
                } catch (NumberFormatException nfe) {
                    
                    throw nfe;
                }
}

@Modifies( { "props" } )
public void applyProp (String key, Object value) {
if (value == null) {
            return;
        }
List<String> propVals;
        if (!hasPropKey(key)) {
        propVals = new ArrayList<String>();
        } else if (props.get(key) == null) { 
            propVals = new ArrayList <String>();
        } else {
            propVals = props.get(key);
        }
        propVals.add(value.toString());
        props.put(key, propVals);
    }
}

public class Contractor extends Employee{

public boolean hasProp(String key, String value) {
        return props.containsKey(key) && props.get(key).contains(value);
    }
    
@Modifies( { "props" } )
public void applyProp (String key, Object value) {
super.applyProp(key, value);
    }


Pubic class TestRules {

protected KieSession kSession;
protected KieHelper kieHelper;
protected KieBase kieBase;

public static void main(String[] args) throws Exception {

kieHelper = new KieHelper();
kieBase = kieHelper.build();
kSession = kieBase.newKieSession();


//loads the compiled rules as pasted above (code emitted)
String rulesResource = loadMRCompiledRules();
kieHelper.addResource(rulesResource, ResourceType.DRL);

for (Employee fact : facts)
kSession.insert(fact);

kSession.fireAllRules();
kSession.dispose();
}


}
...