Hi,
I have finally gained a tiny bit of control (and maybe even some competency) in using the DROOLs language operators ‘no-loop’ and ‘lock-on-active’ as a basis for controlling rule set firing behavior in response
to Fact mutation events (during consequence processing).
I now want to (competently!) use DROOLs language tactics that give me ever finer grained control over managing rule set firing behavior on Fact mutation events. Specifically, I want to be able to implement
some form of ‘Guarded entry/block’ controls.
E.g. let’s say I have a Fact (InsertedFactPOJO) that I insert into the KS and want to have its ‘fireAllRules()’ AgendaSet(s) renedered in exact incremental ordinal stages and in perfect isolation. To do
this, I am testing the inclusion of a ‘countdownLatch’ Semaphore reference as a Fact member (initialized to N=`total rule count` value). I then use this to ‘Guard’ individual rule entry, by generating an explicit predicate participant
(InsertedFactPOJO(countdownLatch == i)
)
@ each ith Rule producedby my template.
Is this approach a valid/sound/complete way to implement ‘Guarded entry/block’ controls in DROOLs? Is there a better way?
As always, my sincerest gratitude to this community for its generosity (and its genius).
Ben
package com.ms.fast.triclear.eligibility.rules.drools_community.questions.posted;
import com.ms.fast.triclear.eligibility.InsertedFactPOJO;
//fact:(backed by Class 'InsertedFactPOJO' has
//- 'countdownLatch' (Semaphore) member
//- 'aList' (List)member
rule
"RULE_ALL_RULES_HAVE_FIRED_ONCE_ORDINALLY"
when
fact:InsertedFactPOJO()
InsertedFactPOJO(countdownLatch == 0)
then
System.out.format("\tALL RULES have fired *EXACTLY* once, *EXACTLY* ordinally. "+
" fact.countdownLatch=%d \n\t fact.aList=%s\n\n",
fact.countdownLatch,
fact.aList.toString());
end
rule
"RULE_3"
when
fact:InsertedFactPOJO()
InsertedFactPOJO(countdownLatch == 3)
//bunch of other L-Value PREDICATES
then
System.out.format("\t %20.20s"+
" \t(DROOLS agenda: consequence fired for L-value predicate match @RULE="+
"3"+" -- fact.countDownLatch=%d)\n",
"Rule 3",fact.countdownLatch);
modify (fact) {
countdownLatch = fact.countdownLatch - 1,
aList.add("Rule 3 pattern-match event added to POJO 'aList' field");
}
end
rule
"RULE_2"
when
fact:InsertedFactPOJO()
InsertedFactPOJO(countdownLatch == 2)
//bunch of other L-Value PREDICATES
then
System.out.format("\t %20.20s"+
" \t(DROOLS agenda: consequence fired for L-value predicate match @RULE="+
"2"+" -- fact.countDownLatch=%d)\n",
"Rule 2",fact.countdownLatch);
modify (fact) {
countdownLatch = fact.countdownLatch - 1,
aList.add("Rule 2 pattern-match event added to POJO 'aList' field");
}
end
rule
"RULE_1"
when
fact:InsertedFactPOJO()
InsertedFactPOJO(countdownLatch == 1)
//bunch of other L-Value PREDICATES
then
System.out.format("\t %20.20s"+
" \t(DROOLS agenda: consequence fired for L-value predicate match @RULE="+
"1"+" -- fact.countDownLatch=%d)\n",
"Rule 1",fact.countdownLatch);
modify (fact) {
countdownLatch = fact.countdownLatch - 1,
aList.add("Rule 1 pattern-match event added to POJO 'aList' field");
}
end
Ben D Cotton III
Morgan Stanley & Co.
OTC Derivatives Clearing Technology
1221 AOTA Rockefeller Ctr - Flr 27
New York, NY 10020
(212)762.9094
ben.cotton@ms.com