[jboss-jira] [JBoss JIRA] (DROOLS-4288) Infinite recursion in drools after version change from v7.20 to v7.21

Mario Fusco (Jira) issues at jboss.org
Wed Jan 8 04:30:26 EST 2020


    [ https://issues.redhat.com/browse/DROOLS-4288?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13943451#comment-13943451 ] 

Mario Fusco commented on DROOLS-4288:
-------------------------------------

[~dacr] Sorry if I'm pointing to something already obvious to you, but it is important that you fully understand the mechanism that prevents this kind of recursion in drools, see https://docs.jboss.org/drools/release/7.31.0.Final/drools-docs/html_single/#property-change-listeners-con_decision-engine

In the rule you pasted I don't expect any loop because you're modifying the 'value' property of the Scoring object while the pattern matching on that object doesn't have any constraint referring to that property. 

I STRONGLY suggest you to provide a complete reproducer of your problem instead of using version 7.20 otherwise you'll have a working application only because you're relying on the side effect of a bug. 

> Infinite recursion in drools after version change from v7.20 to v7.21
> ---------------------------------------------------------------------
>
>                 Key: DROOLS-4288
>                 URL: https://issues.redhat.com/browse/DROOLS-4288
>             Project: Drools
>          Issue Type: Bug
>          Components: core engine
>    Affects Versions: 7.21.0.Final, 7.22.0.Final, 7.23.0.Final
>         Environment: Both Mac and Windows
>            Reporter: Geogie Tom
>            Assignee: Mario Fusco
>            Priority: Major
>             Fix For: 7.25.0.Final
>
>         Attachments: Screen Shot 2019-07-10 at 3.53.10 PM.png, Screen Shot 2019-07-10 at 5.56.32 PM.png, Screen Shot 2019-07-10 at 5.59.28 PM.png, error.png, pojo.png, static.png, static_error.png
>
>
> When there is a version change in drools-compiler from `7.20.0.Final` to `7.21.0.Final` some rules are looping recursively.
> *Code in github:*
> [The working version|https://github.com/padippist/DroolsIssueReporting/tree/issue_v_7.20]
> [The recursively looping version|https://github.com/padippist/DroolsIssueReporting/tree/issue_v_7.21]
> [The change between working and looping version|https://github.com/padippist/DroolsIssueReporting/compare/issue_v_7.20...issue_v_7.21]
> *More details*
> When I fire a rule whose `then` part modifies a fact that is already checked in the `when` part:
> {code:java}
> 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
> {code}
> it doesn't loop recursively.
> But when I call another rule which call a static function from another class:
> {code:java}
> rule "rule 1.2"
>   when
>     $sampleDomain: SampleDomain(CoreUtils.anotherFunction())
>   then
>     System.out.println("Rule 1.2 fired");
>     modify($sampleDomain){
>     		setInstanceVariable1(3)
>     }
> end
> {code}
> it loops recursively.
> The class with static function is
> {code:java}
> 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;
> 	}
> }
> {code}
> My domain file is:
> {code:java}
> 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;
> 	}
> 	
> 	
> }
> {code}
> This is only caused after version change from `7.20.0.Final` to `7.21.0.Final`.  Any guess on what the problem might be?
> When I further looked into the problem I saw this too.
> When we add two functions into the `SampleDomain` class ie
> {code:java}
>     public boolean anotherFunction() {
> 		return true;
> 	}
> 	
> 	public boolean anotherFunction(SampleDomain sampleDomain) {
> 		return true;
> 	}
> {code}
> and use this in the rule like:
> {code:java}
> rule "rule 1.4"
>   when
>     $sampleDomain: SampleDomain(anotherFunction())
>   then
>     System.out.println("Rule 1.4 fired");
>     modify($sampleDomain){
>     		setInstanceVariable1(3)
>     }
> end
> {code}
> and
> {code:java}
> rule "rule 1.5"
>   when
>     $sampleDomain: SampleDomain(anotherFunction($sampleDomain))
>   then
>     System.out.println("Rule 1.5 fired");
>     modify($sampleDomain){
>     		setInstanceVariable3(4)
>     }
> end
> {code}
> these also loops recursively.
> *Code in github:*
> [The recursive looping when using non static methods|https://github.com/padippist/DroolsIssueReporting/tree/issue_v_7.20_non_static_methodes]
> [The change between working and above version|https://github.com/padippist/DroolsIssueReporting/compare/issue_v_7.20...issue_v_7.20_non_static_methodes]
> Also when any of the static method is made non static then method from the domain class is called even though the static method is specified in the rule.
> *Code portions to be noted here are:*
> [Rule where static method is called.|https://github.com/padippist/DroolsIssueReporting/blob/bde2804b250babf11cf5d3cf48640d9e6c88f5b3/src/main/resources/rules/rule1.drl#L21]
> [Another rule which also call the static method.|https://github.com/padippist/DroolsIssueReporting/blob/bde2804b250babf11cf5d3cf48640d9e6c88f5b3/src/main/resources/rules/rule1.drl#L32]
> [The static access modifier removed from the functions which where previously static.|https://github.com/padippist/DroolsIssueReporting/compare/issue_v_7.20...issue_v_7.21_weird_behaviors#diff-4e0f238b1184e2267cb5663b9afeaa6fL7]
> *Code in github:*
> [Weird behaviour when removing static modifier for the functions.|https://github.com/padippist/DroolsIssueReporting/tree/issue_v_7.21_weird_behaviors]
> [The change between working and above version|https://github.com/padippist/DroolsIssueReporting/compare/issue_v_7.20...issue_v_7.21_weird_behaviors]
> *All this are caused in versions after `7.20.0.Final`, ie `7.21.0.Final`, `7.22.0.Final` and `7.23.0.Final`*



--
This message was sent by Atlassian Jira
(v7.13.8#713008)


More information about the jboss-jira mailing list