[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