[rules-users] infinite loop controlling
Mark Proctor
mproctor at codehaus.org
Tue Oct 23 16:49:18 EDT 2007
for individual rules you'd have to manage it yourself. there is a
generic firelimit which can be applied, but it tracks all rules.
Paul Browne wrote:
> Mark,
>
> I'm interested in this (for another mad reason).
>
> I'm guessing that you're refering to AgendaEventListener; Are you
> suggesting using an implementation of this listener that has a counter
> to check if a rule is fired too many times , then calls
> workingmemory.halt() if required?
>
> Or is there a better way of doing this?
>
> Thanks
>
> Paul
>
>
> Mark Proctor wrote:
>> There is no out of the box way to do this, you could add an event
>> listener and check yourself for recursion and halt the session if it
>> is spotted.
>>
>> Mark
>> Isabelle Hupont wrote:
>>> Hi!
>>>
>>> I'm developing a software where the user creates his own rules,
>>> saves then,
>>> and finally fires them in order to preprocess a set of data.
>>> I have implemented a method for controlling infinite loops (its
>>> simply a
>>> timer). I would like to notify to the user the rule that has caused the
>>> infinite loop, in order to change it. My code is the following:
>>>
>>> public void fireRules(Instances instances) {
>>>
>>> try {
>>> assertInstances(instances);
>>>
>>> // Worker thread to execute task that may hang.
>>> WorkerThread workerThread = new WorkerThread();
>>>
>>> // Wait for timeout or task end.
>>> synchronized (this) {
>>> workerThread.start();
>>> try {
>>> this.wait(60000);
>>> } catch (InterruptedException e) {
>>> log.error(e.getLocalizedMessage(),e);
>>> }
>>> if (!workerThread.isWorkDone()) {
>>> // If work is not done then
>>> workingMemory.fireAllRules()
>>> // hasn't finished (the timeout has expired).
>>> workingMemory.halt();
>>> // Here comes the code for
>>> capturing
>>> rule that has code the loop
>>> throw new PersistenceException("Operation
>>> timeout. Please modify rule
>>> XXX" );
>>> }
>>> }
>>>
>>> cleanWorkingMemory();
>>> } catch (PersistenceException e) {
>>> log.error(e.getLocalizedMessage(),e);
>>> }
>>> log.debug("Rule firing finished");
>>> }
>>>
>>> private class WorkerThread extends Thread {
>>> private boolean workDone = false;
>>> public boolean isWorkDone() {
>>> synchronized (SingletonInferenceEngine.this) {
>>> return workDone;
>>> }
>>> }
>>> public void run() {
>>> workingMemory.fireAllRules();
>>> synchronized (SingletonInferenceEngine.this) {
>>> workDone = true;
>>> SingletonInferenceEngine.this.notifyAll();
>>> }
>>> }
>>> }
>>>
>>> Can you help me?
>>> Thanks in advance!
>>>
>>
>>
>> _______________________________________________
>> 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