Re: [rules-users] infinite loop controlling

2007-10-23 Thread Mark Proctor
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

2007-10-23 Thread Paul Browne

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

2007-10-23 Thread Mark Proctor
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