[rules-users] fireUntilHalt and timing of rule activations

Wolfgang Laun wolfgang.laun at gmail.com
Sun Oct 3 05:23:03 EDT 2010


There is another way of associating a Latch object with rules, without
having to store a reference to a Latch in objects:

rule "CountAs"
enabled ( $v )
when
     Latch( $v : value )
     X( ... )
then ... end

At the beginning, insert Latch( false ), which blocks all rules with this
construction, or modify the Latch object to false before inserting more
facts. Then, insert the facts, and, at the end, modify Latch to true.

    Latch latch = new Latch( true );
    FactHandle fh = kSession.insert( latch );
    kSession.fireAllRules();
    latch.setValue( false );
    kSession.update( fh, latch );

Of course, you can use multiple Latch objects, adding a name field with a
specific value, so that a latch applies to a subset of rules only:

rule "CountAs"
enabled ( $v )
when
     Latch( name == "CountAs", $v : value )
     ...

But be aware that changes to Latch objects will retrigger rules that have
fired previously; so with this approach you'll have to make sure to retract
facts when they have been processed.

-W


2010/10/3 Greg Barton <greg_barton at yahoo.com>

> Nope, you're not missing anything.  What you need is a control object of
> some sort thst's inserted after all of the "real" data is inserted. (See
> attached project for an example.) Rules will look like this, if the control
> object is called BatchLatch and data objects A:
>
> rule "CountAs"
>        dialect "java"
>        salience -1
>        when
>                l : Latch()
>                a : A( latch == l )
>        then
>                retract(a);
>                l.incACount();
>                System.out.println("Found an A in " + bl);
> end
>
> Note that the A object being processed is tied back to the latch.  This is
> so multiple latches can be processed simultaneously and their processing
> won't be intermingled.  This is necessary because there's no guarantee that
> two Latch objects aren't in working memory at once. (Though you could create
> a rule that enforces this.)
>
> GreG
>
> --- On Sat, 10/2/10, Norman C <rent_my_time at yahoo.com> wrote:
>
> > From: Norman C <rent_my_time at yahoo.com>
> > Subject: [rules-users] fireUntilHalt and timing of rule activations
> > To: rules-users at lists.jboss.org
> > Date: Saturday, October 2, 2010, 10:22 AM
> > Hi All,
> >
> > In my app, I have a separate thread calling fireUntilHalt()
> > continuously.  I
> > have quite a few rules, and I am using salience extensively
> > to control the order
> >
> > in which rules are executed.  What I have seen (by adding
> > an event listener) is
> > that as a new fact is inserted, various rules are
> > activated.  Often, the
> > fireUntilHalt will start executing fireNextItem in
> > DefaultAgenda before all of
> > the activations are complete.  So if the rule with the
> > highest salience
> > value hasn't been activated at this point, then the first
> > rule to be fired isn't
> >
> > the correct one.
> >
> > This can be worked around by waiting for insert to return
> > and then calling
> > fireAllRules().  But it seems like the session should
> > block fireUntilHalt from
> > trying to execute activated rules until all activations are
> > complete.  Or am I
> > missing something here?
> >
> > thanks,
> > Norman
> >
> >
> >
> >
> >
> > _______________________________________________
> > rules-users mailing list
> > rules-users at lists.jboss.org
> > https://lists.jboss.org/mailman/listinfo/rules-users
> >
>
>
>
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20101003/ff55dc4d/attachment.html 


More information about the rules-users mailing list