[rules-users] Killing a session

Wolfgang Laun wolfgang.laun at gmail.com
Wed May 16 02:56:14 EDT 2012


On 15/05/2012, mike <mikemps at gmail.com> wrote:
> that's nice ... n' a bit clever ... it could work ... I mean, i could
> automatically append that to all sessions given that i control compiling
> the drls.
>
> Is there any setting or something that detects infinite loops? Like it
> would abort if if drools runs into an infinite loop?

Even wily strategies for loop detection aren't fail-safe. Loops can
occur over cycles of two, three, four,... rules. (Four was the max.
that has occurred here in 25 years, but that's no guarantee.) Now, if
you monitor activations and save the last n rules, that won't work
either, because you can have one rule firing repeatedly with varying
facts, and that's not necessarily an infinite loop - but it could be,
returning to the same set of facts after two, three, four,...
activations.

So, implementing any of the aforementioned would only help you in the
testing stage, you can't rely on it in production runs.


>
> I guess I could do something with fireAllRules(int max) but figuring out a
> reasonable max would be fuzzy. I could also use the no-loop attribute but
> it would not pick up some cases of infinite loops.

There are scenarios where a maximum can be derived from the number of
rules, or facts, or both.

A crude safeguard would be a maximum duration, interrupting the thread
running the Engine.

-W

>
> Thank you very much for you help
>
> Cheers
> Mike
>
>
>
> On Tue, May 15, 2012 at 3:55 PM, Wolfgang Laun
> <wolfgang.laun at gmail.com>wrote:
>
>> A very low salience rule depending on nothing and calling halt will stop
>> the run:
>>
>> rule Exit
>> salience -999999999
>> when
>> then
>>     drools.halt();
>> end
>>
>> -W
>>
>>
>> On 15 May 2012 21:46, mike <mikemps at gmail.com> wrote:
>>
>>> Well I got this wrong sorry. Yes I can stop a session if I start it with
>>> fireUntilHalt() but it never stops. I need it to finish by itself too.
>>>
>>> Thank you
>>> Mike
>>>
>>>
>>> On Tue, May 15, 2012 at 11:06 AM, mike <mikemps at gmail.com> wrote:
>>>
>>>> wow that worked like a charm!!! thank you very much  Wolfgang, I owe u
>>>> a
>>>> beer or something :)
>>>>
>>>> Cheers
>>>> Mike
>>>>
>>>>
>>>> On Tue, May 15, 2012 at 11:01 AM, mike <mikemps at gmail.com> wrote:
>>>>
>>>>> Awesome I'll try that :)
>>>>>
>>>>> We got business ppl writing rules ... Those rules are going on
>>>>> infinite
>>>>> loops quite often ...  Frankly I am not excited about killing the
>>>>> session,
>>>>> for me it's just a business request that I am trying to implement
>>>>>
>>>>> Thank you very much Wolfgang
>>>>>
>>>>> Cheers
>>>>> Mike
>>>>>
>>>>>
>>>>> On Tue, May 15, 2012 at 10:53 AM, Wolfgang Laun <
>>>>> wolfgang.laun at gmail.com> wrote:
>>>>>
>>>>>> You are confusing jBPM processes and Java threads.
>>>>>>
>>>>>> You can interrupt the thread SessionThread, but that's not reliable
>>>>>> (if IE is handled, for instance),
>>>>>>
>>>>>> Best would be to call fireUntilHalt() and call the session's halt
>>>>>> method.
>>>>>>
>>>>>> But why would you want to do this sort of weird thing?
>>>>>>
>>>>>> -W
>>>>>>
>>>>>>
>>>>>> On 15/05/2012, mike <mikemps at gmail.com> wrote:
>>>>>> > Hi there,
>>>>>> >
>>>>>> > Is there any way to kill a running session?
>>>>>> >
>>>>>> > I've been trying with StatefulKnowledgeSession.abortProcessInstance
>>>>>> but i
>>>>>> > can't get it working.
>>>>>> >
>>>>>> > For instance .. I got this drl
>>>>>> >
>>>>>> > rule "infinite loop"
>>>>>> >     when x : Integer()
>>>>>> >     then
>>>>>> >          System.out.println(x);
>>>>>> >          Thread.sleep(100);
>>>>>> >           insert(x + 1);
>>>>>> > end
>>>>>> >
>>>>>> > n' this Thread
>>>>>> >
>>>>>> > public class SessionThread implements Runnable {
>>>>>> >  private StatefulKnowledgeSession session;
>>>>>> > public SessionThread(StatefulKnowledgeSession session) {
>>>>>> this.session =
>>>>>> > session; }
>>>>>> >          public void run() { session.fireAllRules(); }
>>>>>> > }
>>>>>> >
>>>>>> > then i create a session with the drl n' do something like ...
>>>>>> >
>>>>>> > session.insert(42);
>>>>>> > Thread thread = new Thread(new SessionThread(session));
>>>>>> > thread.start();
>>>>>> >                 Thread.sleep(1000);
>>>>>> > session.abortProcessInstance(thread.getId());
>>>>>> >
>>>>>> > I've tried diff processInstanceIds and
>>>>>> > session.getProcessInstances()
>>>>>> but
>>>>>> > nothing seems to stop the running session
>>>>>> >
>>>>>> > Thank you
>>>>>> > Mike
>>>>>> >
>>>>>> _______________________________________________
>>>>>> 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
>>>
>>>
>>
>> _______________________________________________
>> rules-users mailing list
>> rules-users at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/rules-users
>>
>>
>


More information about the rules-users mailing list