При изменении версии в drools-compiler с 7.20.0.Final
на 7.21.0.Final
некоторые правила рекурсивно повторяются.
Код в github:
Рабочая версия
Рекурсивно-циклическая версия
Изменение между рабочей и циклической версией
Подробнее
Когда я запускаю правило, чья часть then
изменяет факт, уже проверенный в части when
:
rule "rule 1.1"
when
$sampleDomain: SampleDomain(instanceVariable2 == "Value of instance variable")
then
System.out.println("Rule 1.1 fired");
modify($sampleDomain){
setInstanceVariable1(3)
}
end
он не рекурсивно зацикливается.
Но когда я вызываю другое правило, которое вызывает статическую функцию из другого класса:
rule "rule 1.2"
when
$sampleDomain: SampleDomain(CoreUtils.anotherFunction())
then
System.out.println("Rule 1.2 fired");
modify($sampleDomain){
setInstanceVariable1(3)
}
end
, он зацикливается рекурсивно.
класс со статической функцией:
import com.drool_issue.domain.SampleDomain;
public class CoreUtils {
public static boolean anotherFunction() {
System.out.println("anotherFunction() inside CoreUtils");
return true;
}
public static boolean anotherFunction(SampleDomain sampleDomain) {
System.out.println("anotherFunction(SampleDomain sampleDomain) inside CoreUtils");
return true;
}
}
Файл моего домена:
public class SampleDomain {
private int instanceVariable1;
private String instanceVariable2;
private int instanceVariable3;
public int getInstanceVariable1() {
return instanceVariable1;
}
public void setInstanceVariable1(int instanceVariable1) {
this.instanceVariable1 = instanceVariable1;
}
public String getInstanceVariable2() {
return instanceVariable2;
}
public void setInstanceVariable2(String instanceVariable2) {
this.instanceVariable2 = instanceVariable2;
}
public int getInstanceVariable3() {
return instanceVariable3;
}
public void setInstanceVariable3(int instanceVariable3) {
this.instanceVariable3 = instanceVariable3;
}
}
Это вызывается только после изменения версии с 7.20.0.Final
на 7.21.0.Final
.Любое предположение о том, в чем может быть проблема?
Когда я продолжил изучать проблему, я тоже это увидел.
Когда мы добавляем две функции в класс SampleDomain
, то есть
public boolean anotherFunction() {
return true;
}
public boolean anotherFunction(SampleDomain sampleDomain) {
return true;
}
и используйте это в правиле, например:
rule "rule 1.4"
when
$sampleDomain: SampleDomain(anotherFunction())
then
System.out.println("Rule 1.4 fired");
modify($sampleDomain){
setInstanceVariable1(3)
}
end
и
rule "rule 1.5"
when
$sampleDomain: SampleDomain(anotherFunction($sampleDomain))
then
System.out.println("Rule 1.5 fired");
modify($sampleDomain){
setInstanceVariable3(4)
}
end
они также рекурсивно зацикливаются.
Код в github:
Рекурсивное зацикливание при использовании нестатических методов
Изменение между рабочей и выше версией
Также, когда любойстатического метода делается нестатичным, тогда вызывается метод из класса домена, даже если статический метод указан в правиле.
Здесь следует отметить следующие части кода:
Правило, где вызывается статический метод.
Другое правило, которое также вызывает статический метод.
Модификатор статического доступаудалено из функций, которые ранее были статическими.
Код в github:
Странное поведение при удалении статического модификатора для функций.
Изменение между рабочей и более поздней версиями
Все это вызывается в версиях после 7.20.0.Final
т.е. 7.21.0.Final
, 7.22.0.Final
и 7.23.0.Final