[rules-users] activation dependent of rule order in drl file in 5.2.0.Final?

Florian Beckmann florian.beckmann at camunda.com
Tue Jun 28 15:36:15 EDT 2011


Hi,

because of https://issues.jboss.org/browse/JBRULES-2942 i just migrated our 
(maven) project to 5.2.0.Final - we depend on salience in some of our rules.

However, after the salience issue was gone I'm facing a new problem in several 
test cases:
Rules in previously (drools 5.1.1) working rule files don't get activated 
anymore when I insert facts - none at all.
When moving the rule expected to fire (see "rule 4" in attached file)  to the 
first position in the drl file then suddenly several rules get activated and the 
expected rule fires.

This shouldn't be the case, shouldn't it? Or do I miss something obvious here?

Could a corrupt file somehow cause this?

I attachached the rule file which causes the problem (I needed to obfuscate 
some names, sry). It is quite simple.

I experienced a similar issue (again since 5.2.0.Final) with rules generated 
from templates, where I had to change the constraints order in the templates' 
LHS for then generated rules to get activated at all.

First I would like to know if my statement that the rule position in the drl 
file shouldn't influence the activation (I don't mean firing or order of 
activations) of a rule at all, is correct.
I don't use agenda groups.

And second if someone experienced similar issues.

I will try to build a test case which hopefully can reproduce this as soon as 
possible.


Florian
-------------- next part --------------
package com.example.objectwrapper

#list any import classes here.
import com.example.objectwrapper.api.product.model.Wrapper;
import com.example.objectwrapper.api.supplier.WrapperModule;
import com.example.objectwrapper.api.stock.StockStatus;

global org.slf4j.Logger logger;
global java.util.HashMap stocks;

rule "EXCEPTION"
	salience 100
	when
		$wrapperModule1 : WrapperModule()
		$wrapperModule2 : WrapperModule(this != $wrapperModule1)
	then
		logger.debug("****** rule " + drools.getRule().getName() + " fired ******\n");
		logger.debug("wrapperModule1" + $wrapperModule1 + " exists\n");
		logger.debug("wrapperModule2 " + $wrapperModule2 + " exists\n");
		logger.debug("****** end rule " + drools.getRule().getName() + " fired ******\n");
		throw new IllegalStateException("More than one WrapperModule exists: wrapperModule1[" + $wrapperModule1 + "]/wrapperModule2[" + $wrapperModule2 + "]\n");
end

rule "Rule 4"
	when
		$wrapper : Wrapper
		(
			this.product.boolean4 == true
		)
		eval( ( ((StockStatus) stocks.get($wrapper.getProduct().getId())).getQuantity() == 0) == true)
	then
		retract($wrapper);
		logger.debug("****** rule " + drools.getRule().getName() + " fired ******");
		logger.debug("Retracted from WM: Wrapper " + $wrapper);
		logger.debug("****** end rule " + drools.getRule().getName() + " fired ******\n");
end

rule "Rule 1"
	when
		$wrapperModule : WrapperModule
		(
			(this == WrapperModule.ENUM_A) || (this == WrapperModule.ENUM_B)
		)
		not $wrapperModule2 : WrapperModule(this != $wrapperModule)

		$wrapper : Wrapper
		(
			(product.boolean1 == true)
		)
	then
		retract($wrapper);
		logger.debug("****** rule " + drools.getRule().getName() + " fired ******");
		logger.debug("Retracted from WM: Wrapper " + $wrapper);
		logger.debug("****** end rule " + drools.getRule().getName() + " fired ******\n");
end

rule "Rule 2"
	when
		$wrapperModule : WrapperModule
		(
			(this == WrapperModule.ENUM_C)
		)
		not $wrapperModule2 : WrapperModule(this != $wrapperModule)

		$wrapper : Wrapper
		(
		)
		eval( (( (StockStatus) stocks.get($wrapper.getProduct().getId())).getQuantity() <= 0) == true)
	then
		retract($wrapper);
		logger.debug("****** rule " + drools.getRule().getName() + " fired ******");
		logger.debug("Retracted from WM: Wrapper " + $wrapper);
		logger.debug("****** end rule " + drools.getRule().getName() + " fired ******\n");
end

rule "Rule 3"
	when
		$wrapper : Wrapper
		(
			this.product.boolean3 == true
		)
	then
		retract($wrapper);
		logger.debug("****** rule " + drools.getRule().getName() + " fired ******");
		logger.debug("Retracted from WM: Wrapper " + $wrapper);
		logger.debug("****** end rule " + drools.getRule().getName() + " fired ******\n");
end

rule "Rule 5"
	when
		$wrapper : Wrapper
		(
			this.product.boolean5 == true
		)
		eval( (((StockStatus) stocks.get($wrapper.getProduct().getId())).getQuantity() == 0) == true)
	then
		retract($wrapper);
		logger.debug("****** rule " + drools.getRule().getName() + " fired ******");
		logger.debug("Retracted from WM: Wrapper " + $wrapper);
		logger.debug("****** end rule " + drools.getRule().getName() + " fired ******\n");
end

rule "Rule 6"
	when
		$wrapper : Wrapper
		(
			this.product.boolean6 == true
		)
	then
		retract($wrapper);
		logger.debug("****** rule " + drools.getRule().getName() + " fired ******\n");
		logger.debug("Retracted from WM: Wrapper " + $wrapper);
		logger.debug("****** end rule " + drools.getRule().getName() + " fired ******\n");
end


More information about the rules-users mailing list