При тестировании нового правила, использующего функцию 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();
}
}