[jboss-svn-commits] JBL Code SVN: r20200 - in labs/jbossrules/trunk/drools-core/src: main/java/org/drools/process/instance/timer and 2 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Wed May 28 12:37:44 EDT 2008
Author: mark.proctor at jboss.com
Date: 2008-05-28 12:37:43 -0400 (Wed, 28 May 2008)
New Revision: 20200
Modified:
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/timer/Timer.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/timer/TimerManager.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/scheduler/impl/jdk/JDKScheduler.java
labs/jbossrules/trunk/drools-core/src/test/java/org/drools/process/TimerTest.java
Log:
JBRULES-1625 Create Scheduler API with JDK implementation
-Processes now work with the new Scheduler api, which currently wraps the JDK scheduler
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/timer/Timer.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/timer/Timer.java 2008-05-28 15:50:47 UTC (rev 20199)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/core/timer/Timer.java 2008-05-28 16:37:43 UTC (rev 20200)
@@ -1,10 +1,13 @@
package org.drools.process.core.timer;
+import org.drools.scheduler.JobHandle;
+
public class Timer {
private long id;
private long delay;
private long period;
+ private JobHandle jobHandle;
public long getId() {
return id;
@@ -29,5 +32,15 @@
public void setPeriod(long period) {
this.period = period;
}
+
+ public JobHandle getJobHandle() {
+ return jobHandle;
+ }
+
+ public void setJobHandle(JobHandle jobHandle) {
+ this.jobHandle = jobHandle;
+ }
+
+
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/timer/TimerManager.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/timer/TimerManager.java 2008-05-28 15:50:47 UTC (rev 20199)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/timer/TimerManager.java 2008-05-28 16:37:43 UTC (rev 20200)
@@ -1,5 +1,6 @@
package org.drools.process.instance.timer;
+import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.TimerTask;
@@ -7,67 +8,134 @@
import org.drools.WorkingMemory;
import org.drools.process.core.timer.Timer;
import org.drools.process.instance.ProcessInstance;
+import org.drools.scheduler.Job;
+import org.drools.scheduler.JobContext;
+import org.drools.scheduler.JobHandle;
+import org.drools.scheduler.Scheduler;
+import org.drools.scheduler.SchedulerFactory;
+import org.drools.scheduler.Trigger;
public class TimerManager {
-
- private Map<Timer, Long> timers = new HashMap<Timer, Long>();
- private Map<Timer, java.util.Timer> utilTimers = new HashMap<Timer, java.util.Timer>();
- private long timerId = 0;
-
- private WorkingMemory workingMemory;
-
+ private long timerId = 0;
+
+ private WorkingMemory workingMemory;
+ private Scheduler scheduler;
+
public TimerManager(WorkingMemory workingMemory) {
this.workingMemory = workingMemory;
+ this.scheduler = SchedulerFactory.getScheduler();
}
-
- public void registerTimer(final Timer timer, ProcessInstance processInstance) {
- timer.setId(++timerId);
- timers.put(timer, processInstance.getId());
- TimerTask timerTask = new TimerTask() {
- public void run() {
- timerTriggered(timer);
+
+ public void registerTimer(final Timer timer,
+ ProcessInstance processInstance) {
+ timer.setId( ++timerId );
+
+ ProcessJobContext ctx = new ProcessJobContext( timer,
+ processInstance.getId(),
+ this.workingMemory );
+
+ JobHandle jobHandle = this.scheduler.scheduleJob( ProcessJob.instance,
+ ctx,
+ new TimerTrigger( timer.getDelay(),
+ timer.getPeriod() ) );
+ timer.setJobHandle( jobHandle );
+ }
+
+ public void cancelTimer(Timer timer) {
+ scheduler.removeJob( timer.getJobHandle() );
+ }
+
+ public static class ProcessJob
+ implements
+ Job {
+ public final static ProcessJob instance = new ProcessJob();
+
+ public void execute(JobContext c) {
+ ProcessJobContext ctx = (ProcessJobContext) c;
+
+ Long processInstanceId = ctx.getProcessInstanceId();
+ WorkingMemory workingMemory = ctx.getWorkingMemory();
+
+ if ( processInstanceId == null ) {
+ throw new IllegalArgumentException( "Could not find process instance for timer " );
}
- };
- java.util.Timer utilTimer = new java.util.Timer();
- utilTimers.put(timer, utilTimer);
- if (timer.getPeriod() > 0) {
- utilTimer.schedule(
- timerTask,
- timer.getDelay(),
- timer.getPeriod());
- } else {
- utilTimer.schedule(
- timerTask,
- timer.getPeriod());
+
+ ProcessInstance processInstance = workingMemory.getProcessInstance( processInstanceId );
+ // process instance may have finished already
+ if ( processInstance != null ) {
+ processInstance.timerTriggered( ctx.getTimer() );
+ }
}
+
}
-
- public void cancelTimer(Timer timer) {
- java.util.Timer utilTimer = utilTimers.get(timer);
- if (utilTimer == null) {
- throw new IllegalArgumentException(
- "Could not find timer implementation for timer " + timer);
+
+ public static class TimerTrigger
+ implements
+ Trigger {
+ private long delay;
+ private long period;
+ private int count;
+
+ public TimerTrigger(long delay,
+ long period) {
+ this.delay = delay;
+ this.period = period;
}
- utilTimer.cancel();
- utilTimers.remove(timer);
- timers.remove(timer);
+
+ public Date getNextFireTime() {
+ Date date = null;
+ if ( period == 0 ) {
+ if ( count == 0 ) {
+ date = new Date( System.currentTimeMillis() + this.delay );
+ }
+ } else if ( count == 0 ) {
+ date = new Date( System.currentTimeMillis() + this.period + this.delay );
+ } else {
+ date = new Date( System.currentTimeMillis() + this.delay );
+ }
+ count++;
+ return date;
+ }
+
}
-
- public void timerTriggered(Timer timer) {
- Long processInstanceId = timers.get(timer);
- if (processInstanceId == null) {
- throw new IllegalArgumentException(
- "Could not find process instance for timer " + timer);
+
+ public static class ProcessJobContext
+ implements
+ JobContext {
+ private Long processInstanceId;
+ private WorkingMemory workingMemory;
+ private Timer timer;
+
+ private JobHandle jobHandle;
+
+ public ProcessJobContext(final Timer timer,
+ final Long processInstanceId,
+ final WorkingMemory workingMemory) {
+ this.timer = timer;
+ this.processInstanceId = processInstanceId;
+ this.workingMemory = workingMemory;
}
- ProcessInstance processInstance = workingMemory.getProcessInstance(processInstanceId);
- // process instance may have finished already
- if (processInstance != null) {
- processInstance.timerTriggered(timer);
+
+ public Long getProcessInstanceId() {
+ return processInstanceId;
}
- if (timer.getPeriod() == 0) {
- utilTimers.remove(timer);
- timers.remove(timer);
+
+ public WorkingMemory getWorkingMemory() {
+ return workingMemory;
}
+
+ public JobHandle getJobHandle() {
+ return this.jobHandle;
+ }
+
+ public void setJobHandle(JobHandle jobHandle) {
+ this.jobHandle = jobHandle;
+ }
+
+ public Timer getTimer() {
+ return timer;
+ }
+
}
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/scheduler/impl/jdk/JDKScheduler.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/scheduler/impl/jdk/JDKScheduler.java 2008-05-28 15:50:47 UTC (rev 20199)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/scheduler/impl/jdk/JDKScheduler.java 2008-05-28 16:37:43 UTC (rev 20200)
@@ -80,10 +80,12 @@
// our triggers allow for flexible rescheduling
Date date = this.trigger.getNextFireTime();
- ScheduledFuture future = schedule( date,
- this,
- this.scheduler );
- this.handle.setFuture( future );
+ if ( date != null ) {
+ ScheduledFuture future = schedule( date,
+ this,
+ this.scheduler );
+ this.handle.setFuture( future );
+ }
return null;
}
Modified: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/process/TimerTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/process/TimerTest.java 2008-05-28 15:50:47 UTC (rev 20199)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/process/TimerTest.java 2008-05-28 16:37:43 UTC (rev 20200)
@@ -29,7 +29,7 @@
Timer timer = new Timer();
timerManager.registerTimer(timer, processInstance);
try {
- Thread.sleep(500);
+ Thread.sleep(1000);
} catch (InterruptedException e) {
// do nothing
}
@@ -49,23 +49,33 @@
counter = 0;
timer = new Timer();
- timer.setDelay(1000);
- timer.setPeriod(1000);
+ timer.setDelay(500);
+ timer.setPeriod(2000);
timerManager.registerTimer(timer, processInstance);
assertEquals(0, counter);
try {
- Thread.sleep(5500);
+ Thread.sleep(2500);
} catch (InterruptedException e) {
// do nothing
}
- assertEquals(5, counter);
+ assertEquals(1, counter);
+
+ try {
+ Thread.sleep(2000);
+ } catch (InterruptedException e) {
+ // do nothing
+ }
+ // we can't know exactly how many times this will fire as timers are not precise, but should be atleast 4
+ assertTrue( counter >= 4 );
+
timerManager.cancelTimer(timer);
- try {
+ int lastCount = counter;
+ try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// do nothing
}
- assertEquals(5, counter);
+ assertEquals(lastCount, counter);
}
}
More information about the jboss-svn-commits
mailing list