[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