On 30 August 2011 14:27, Dean Whisnant <dean(a)basys.com> wrote:
My project involves rule creation by customers, business analysts,
and
developers. We have a base set of rules that fire for every transaction and
then we fire custom rules within a stateful session. An issue I've started
to run into is rules being created that fire endlessly. I initialize the
session with an event listener that we use to extract all rules fired for
each line item of a transaction. Once the session is initialized and all
rules from various agenda groups loaded we do a fireall rules.
My questions are:
1) how can I detect I have a runaway rule/rules.
Is there a method or listener that could detect this for me? Does
anyone have a formula they use to do so? I had thought that I could use my
event listener that I track the rules with to grab the last X number of
rules fires and see if rule y gets fired more that z times. But is there a
simpler method?
It's not even as simple as that. ;-) Multiple firing of a rule r within n
firings may not be loops if this happens with different facts bound to
patterns.
2) once I've detected a runaway rule, how can I gracefully stop
drools rule
execution? I read of the command drools.halt in different posts, but not
sure if this would be what I'm looking at doing.
If you detect it during a consequence execution, throw an exception and
catch it with a custom consequence exception handler.
Using a limit on fire all rules might be another way, in combination with
logging all activations.
Finally, someone with a little savvy should be able to detect some just by
looking at them. The telltale marks are well known...
-W
Any thoughts are appreciated.
Thank you!
Dean
StatefulKnowledgeSession ksession =
buildOutgoingStatefulKnowledgeSession(supportingUDTList);
// AgendaEventListener agendaListener = new
HipaaAgendaListener();
ksession.addEventListener(_ruleLog);
for (int i = 0; i < _agendaGroups.size(); i++)
{
if (_log.isDebugEnabled()) _log.debug("Focus on
Agenda Group " + _agendaGroups.get(i));
ksession.getAgenda().getAgendaGroup(_agendaGroups.get(i)).setFocus();
// Fire them all
try
{
ksession.fireAllRules();
}
catch (Exception e)
{
_log.error("FireAllRules exception. Error="
+ e.getMessage()); // error
}
}
_______________________________________________
rules-users mailing list
rules-users(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users