[jboss-svn-commits] JBL Code SVN: r20183 - in labs/jbossrules/trunk/drools-core/src: main/java/org/drools/scheduler and 6 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Tue May 27 21:34:24 EDT 2008


Author: mark.proctor at jboss.com
Date: 2008-05-27 21:34:24 -0400 (Tue, 27 May 2008)
New Revision: 20183

Added:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/scheduler/
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/scheduler/Job.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/scheduler/JobContext.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/scheduler/JobHandle.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/scheduler/Scheduler.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/scheduler/Trigger.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/scheduler/impl/
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/scheduler/impl/jdk/
   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/scheduler/
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/scheduler/impl/
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/scheduler/impl/jdk/
   labs/jbossrules/trunk/drools-core/src/test/java/org/drools/scheduler/impl/jdk/JDKSchedulerTest.java
Log:
JBRULES-1625 Create Scheduler API with JDK implementation
-Added initial api
-Added JDK wrapper impl

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/scheduler/Job.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/scheduler/Job.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/scheduler/Job.java	2008-05-28 01:34:24 UTC (rev 20183)
@@ -0,0 +1,5 @@
+package org.drools.scheduler;
+
+public interface Job {
+	public void execute(JobContext ctx);
+}

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/scheduler/JobContext.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/scheduler/JobContext.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/scheduler/JobContext.java	2008-05-28 01:34:24 UTC (rev 20183)
@@ -0,0 +1,10 @@
+package org.drools.scheduler;
+
+public interface JobContext {    
+    /**
+     * This method shoud only be called by the scheduler
+     */    
+    public void setJobHandle(JobHandle jobHandle);
+    
+    public JobHandle getJobHandle();
+}

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/scheduler/JobHandle.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/scheduler/JobHandle.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/scheduler/JobHandle.java	2008-05-28 01:34:24 UTC (rev 20183)
@@ -0,0 +1,5 @@
+package org.drools.scheduler;
+
+public interface JobHandle {
+
+}

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/scheduler/Scheduler.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/scheduler/Scheduler.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/scheduler/Scheduler.java	2008-05-28 01:34:24 UTC (rev 20183)
@@ -0,0 +1,7 @@
+package org.drools.scheduler;
+
+public interface Scheduler {
+	public JobHandle scheduleJob(Job job, JobContext ctx, Trigger trigger);
+	
+	public boolean removeJob(JobHandle jobHandle);
+}

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/scheduler/Trigger.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/scheduler/Trigger.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/scheduler/Trigger.java	2008-05-28 01:34:24 UTC (rev 20183)
@@ -0,0 +1,7 @@
+package org.drools.scheduler;
+
+import java.util.Date;
+
+public interface Trigger {
+    public Date getNextFireTime();
+}

Added: 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	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/scheduler/impl/jdk/JDKScheduler.java	2008-05-28 01:34:24 UTC (rev 20183)
@@ -0,0 +1,129 @@
+package org.drools.scheduler.impl.jdk;
+
+import java.util.Date;
+import java.util.concurrent.Callable;
+import java.util.concurrent.RunnableScheduledFuture;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+import org.drools.scheduler.Job;
+import org.drools.scheduler.JobContext;
+import org.drools.scheduler.JobHandle;
+import org.drools.scheduler.Scheduler;
+import org.drools.scheduler.Trigger;
+
+public class JDKScheduler
+    implements
+    Scheduler {
+    private ScheduledThreadPoolExecutor scheduler;
+
+    public JDKScheduler() {
+        this( 3 );
+    }
+
+    public JDKScheduler(int size) {
+        this.scheduler = new ScheduledThreadPoolExecutor( size );
+    }
+
+    public JobHandle scheduleJob(Job job,
+                                 JobContext ctx,
+                                 Trigger trigger) {
+        JDKJobHandle jobHandle = new JDKJobHandle();
+
+        Date date = trigger.getNextFireTime();
+
+        if ( date != null ) {
+            JDKCallableJob callableJob = new JDKCallableJob( job,
+                                                             ctx,
+                                                             trigger,
+                                                             jobHandle,
+                                                             this.scheduler );
+            ScheduledFuture future = schedule( date,
+                                               callableJob,
+                                               this.scheduler );
+            jobHandle.setFuture( future );
+
+            return jobHandle;
+        } else {
+            return null;
+        }
+    }
+
+    public boolean removeJob(JobHandle jobHandle) {
+        return this.scheduler.remove( (RunnableScheduledFuture) ((JDKJobHandle) jobHandle).getFuture() );
+    }
+
+    public static class JDKCallableJob
+        implements
+        Callable {
+        private Job                         job;
+        private Trigger                     trigger;
+        private JobContext                  ctx;
+        private ScheduledThreadPoolExecutor scheduler;
+        private JDKJobHandle                handle;
+
+        public JDKCallableJob(Job job,
+                              JobContext ctx,
+                              Trigger trigger,
+                              JDKJobHandle handle,
+                              ScheduledThreadPoolExecutor scheduler) {
+            this.job = job;
+            this.ctx = ctx;
+            this.trigger = trigger;
+            this.handle = handle;
+            this.scheduler = scheduler;
+        }
+
+        public Object call() throws Exception {
+            this.job.execute( this.ctx );
+
+            // our triggers allow for flexible rescheduling
+            Date date = this.trigger.getNextFireTime();
+            ScheduledFuture future = schedule( date,
+                                               this,
+                                               this.scheduler );
+            this.handle.setFuture( future );
+
+            return null;
+        }
+    }
+
+    public static class JDKJobHandle
+        implements
+        JobHandle {
+        private ScheduledFuture future;
+
+        public JDKJobHandle() {
+
+        }
+
+        public ScheduledFuture getFuture() {
+            return future;
+        }
+
+        public void setFuture(ScheduledFuture future) {
+            this.future = future;
+        }
+
+    }
+
+    private static ScheduledFuture schedule(Date date,
+                                            JDKCallableJob callableJob,
+                                            ScheduledThreadPoolExecutor scheduler) {
+        long then = date.getTime();
+        long now = System.currentTimeMillis();
+        ScheduledFuture future = null;
+        if ( then >= now ) {
+            future = scheduler.schedule( callableJob,
+                                         then - now,
+                                         TimeUnit.MILLISECONDS );
+        } else {
+            future = scheduler.schedule( callableJob,
+                                         0,
+                                         TimeUnit.MILLISECONDS );
+        }
+        return future;
+    }
+
+}

Added: labs/jbossrules/trunk/drools-core/src/test/java/org/drools/scheduler/impl/jdk/JDKSchedulerTest.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/test/java/org/drools/scheduler/impl/jdk/JDKSchedulerTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/test/java/org/drools/scheduler/impl/jdk/JDKSchedulerTest.java	2008-05-28 01:34:24 UTC (rev 20183)
@@ -0,0 +1,134 @@
+package org.drools.scheduler.impl.jdk;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Stack;
+
+import org.drools.scheduler.Job;
+import org.drools.scheduler.JobContext;
+import org.drools.scheduler.JobHandle;
+import org.drools.scheduler.Scheduler;
+import org.drools.scheduler.Trigger;
+
+import junit.framework.TestCase;
+
+public class JDKSchedulerTest extends TestCase {
+    
+    public void test1() throws Exception {
+        JDKScheduler scheduler = new JDKScheduler(); 
+        Trigger trigger = new DelayedTrigger( 100 );
+        HelloWorldJobContext ctx = new HelloWorldJobContext( "hello world", scheduler);
+        scheduler.scheduleJob( new HelloWorldJob(), ctx,  trigger);        
+        Thread.sleep( 500 );
+        assertEquals( 1, ctx.getList().size() ); 
+    }    
+    
+    public void test2() throws Exception {
+        JDKScheduler scheduler = new JDKScheduler(); 
+        Trigger trigger = new DelayedTrigger(  new long[] { 100, 100, 100} );
+        HelloWorldJobContext ctx = new HelloWorldJobContext( "hello world", scheduler);
+        scheduler.scheduleJob( new HelloWorldJob(), ctx,  trigger);        
+        Thread.sleep( 500 );
+        
+        assertEquals( 3, ctx.getList().size() );
+    }    
+        
+    
+	public void test3() throws Exception {
+		JDKScheduler scheduler = new JDKScheduler(); 
+		Trigger trigger = new DelayedTrigger( new long[] { 100, 100, 100, 100, 100 } );
+		HelloWorldJobContext ctx = new HelloWorldJobContext( "hello world", scheduler);
+		ctx.setLimit( 3 );
+		scheduler.scheduleJob( new HelloWorldJob(), ctx,  trigger);		
+		Thread.sleep( 1000 );
+		
+		assertEquals( 4, ctx.getList().size() );
+	}
+	
+	public static class HelloWorldJob implements Job {
+        @Override
+        public void execute(JobContext c) {
+            HelloWorldJobContext ctx = (HelloWorldJobContext) c;
+            int counter = ctx.increaseCounter();
+            if ( counter > 3 ) {
+                ctx.scheduler.removeJob( ctx.getJobHandle() );
+            }
+            ctx.getList().add( ((HelloWorldJobContext)ctx).getMessage() + " : " + counter);
+        }	    
+	}
+	
+	public static class HelloWorldJobContext implements JobContext {
+	    private String message;
+	    private  Scheduler scheduler;
+	    private JobHandle jobHandle;
+	    
+	    private List list;
+	    
+	    private int counter;	    
+	    private int limit;
+	    
+	    public HelloWorldJobContext(String message, Scheduler scheduler) {
+	        this.message = message;
+	        this.scheduler = scheduler;
+	        this.list = new ArrayList();
+	    }
+	    
+	    public String getMessage() {
+	        return this.message;
+	    }
+	    
+	    public int increaseCounter() {
+	        return this.counter++;
+	    }
+
+        @Override
+        public JobHandle getJobHandle() {
+            return this.jobHandle;
+        }
+
+        @Override
+        public void setJobHandle(JobHandle jobHandle) {
+            this.jobHandle = jobHandle;
+        }
+
+        public int getLimit() {
+            return limit;
+        }
+
+        public void setLimit(int limit) {
+            this.limit = limit;
+        }
+
+        public List getList() {
+            return list;
+        }
+	    
+	    
+	}
+	
+	public static class DelayedTrigger implements Trigger {
+	    public Stack<Long> stack;
+	    
+	    public DelayedTrigger(long delay) {
+	        this( new long[] { delay } );
+	    }
+	    
+        public DelayedTrigger(long[] delay) {
+            this.stack = new Stack<Long>();
+            for( int i = delay.length-1; i >= 0; i-- ) {
+                this.stack.push( delay[i] );
+            }
+        }	    
+
+        @Override
+        public Date getNextFireTime() {
+            if ( !this.stack.isEmpty() ) {
+                return new Date( this.stack.pop() );    
+            } else {
+                return null;
+            }
+        }
+	    
+	}
+}




More information about the jboss-svn-commits mailing list