[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