Re: [rules-users] infinite loop controlling
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(6); } 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@lists.jboss.org https://lists.jboss.org/mailman/listinfo/rules-users ___ rules-users mailing list rules-users@lists.jboss.org https://lists.jboss.org/mailman/listinfo/rules-users ___ rules-users mailing list rules-users@lists.jboss.org https://lists.jboss.org/mailman/listinfo/rules-users
Re: [rules-users] infinite loop controlling
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(6); } 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@lists.jboss.org https://lists.jboss.org/mailman/listinfo/rules-users ___ rules-users mailing list rules-users@lists.jboss.org https://lists.jboss.org/mailman/listinfo/rules-users
Re: [rules-users] infinite loop controlling
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(6); } 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@lists.jboss.org https://lists.jboss.org/mailman/listinfo/rules-users