[jboss-svn-commits] JBL Code SVN: r20235 - in labs/jbossrules/trunk: drools-jsr94/src/main/java/org/drools/jsr94/rules and 1 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Fri May 30 14:46:18 EDT 2008


Author: tirelli
Date: 2008-05-30 14:46:18 -0400 (Fri, 30 May 2008)
New Revision: 20235

Added:
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/time/impl/JDKScheduler.java
Modified:
   labs/jbossrules/trunk/drools-jsr94/src/main/java/org/drools/jsr94/rules/Jsr94FactHandleFactory.java
   labs/jbossrules/trunk/drools-jsr94/src/main/java/org/drools/jsr94/rules/StatefulRuleSessionImpl.java
   labs/jbossrules/trunk/drools-jsr94/src/main/java/org/drools/jsr94/rules/admin/RuleExecutionSetImpl.java
Log:
Refactoring session clock to unify CEP and processes clock implementations

Added: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/time/impl/JDKScheduler.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/time/impl/JDKScheduler.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/time/impl/JDKScheduler.java	2008-05-30 18:46:18 UTC (rev 20235)
@@ -0,0 +1,163 @@
+/*
+ * Copyright 2008 JBoss Inc
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+package org.drools.time.impl;
+
+import java.util.Date;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+import org.drools.time.Job;
+import org.drools.time.JobContext;
+import org.drools.time.JobHandle;
+import org.drools.time.SessionClock;
+import org.drools.time.TimerService;
+import org.drools.time.Trigger;
+
+/**
+ * A default Scheduler implementation that uses the
+ * JDK built-in ScheduledThreadPoolExecutor as the
+ * scheduler and the system clock as the clock.
+ * 
+ */
+public class JDKScheduler
+    implements
+    TimerService,
+    SessionClock {
+    
+    private ScheduledThreadPoolExecutor scheduler;
+
+    public JDKScheduler() {
+        this( 3 );
+    }
+
+    public JDKScheduler(int size) {
+        this.scheduler = new ScheduledThreadPoolExecutor( size );
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public long getCurrentTime() {
+        return System.currentTimeMillis();
+    }
+
+    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( (Runnable) ((JDKJobHandle) jobHandle).getFuture() );
+    }
+
+    private static ScheduledFuture<Void> schedule(Date date,
+                                                  JDKCallableJob callableJob,
+                                                  ScheduledThreadPoolExecutor scheduler) {
+        long then = date.getTime();
+        long now = System.currentTimeMillis();
+        ScheduledFuture<Void> future = null;
+        if ( then >= now ) {
+            future = scheduler.schedule( callableJob,
+                                         then - now,
+                                         TimeUnit.MILLISECONDS );
+        } else {
+            future = scheduler.schedule( callableJob,
+                                         0,
+                                         TimeUnit.MILLISECONDS );
+        }
+        return future;
+    }
+
+    public static class JDKCallableJob
+        implements
+        Callable<Void> {
+        private final Job                         job;
+        private final Trigger                     trigger;
+        private final JobContext                  ctx;
+        private final ScheduledThreadPoolExecutor scheduler;
+        private final 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 Void call() throws Exception {
+            this.job.execute( this.ctx );
+
+            // our triggers allow for flexible rescheduling
+            Date date = this.trigger.getNextFireTime();
+            if ( date != null ) {
+                ScheduledFuture<Void> future = schedule( date,
+                                                         this,
+                                                         this.scheduler );
+                this.handle.setFuture( future );
+            }
+
+            return null;
+        }
+    }
+
+    public class JDKJobHandle
+        implements
+        JobHandle {
+
+        private static final long serialVersionUID = 6607880828232839927L;
+        
+        private ScheduledFuture<Void> future;
+
+        public JDKJobHandle() {
+        }
+
+        public ScheduledFuture<Void> getFuture() {
+            return future;
+        }
+
+        public void setFuture(ScheduledFuture<Void> future) {
+            this.future = future;
+        }
+    }
+
+}

Modified: labs/jbossrules/trunk/drools-jsr94/src/main/java/org/drools/jsr94/rules/Jsr94FactHandleFactory.java
===================================================================
--- labs/jbossrules/trunk/drools-jsr94/src/main/java/org/drools/jsr94/rules/Jsr94FactHandleFactory.java	2008-05-30 18:42:27 UTC (rev 20234)
+++ labs/jbossrules/trunk/drools-jsr94/src/main/java/org/drools/jsr94/rules/Jsr94FactHandleFactory.java	2008-05-30 18:46:18 UTC (rev 20235)
@@ -16,7 +16,6 @@
  * limitations under the License.
  */
 
-import org.drools.TemporalSession;
 import org.drools.common.AbstractFactHandleFactory;
 import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
@@ -42,7 +41,7 @@
             // later we need to centralize the following code snippet in a common method
             // shared by all fact handle factory implementations
             TypeDeclaration type = conf.getTypeDeclaration();
-            long timestamp = ((TemporalSession) workingMemory).getSessionClock().getCurrentTime();
+            long timestamp = workingMemory.getSessionClock().getCurrentTime();
             long duration = 0;
             if ( type.getDurationExtractor() != null ) {
                 duration = type.getDurationExtractor().getLongValue( workingMemory,

Modified: labs/jbossrules/trunk/drools-jsr94/src/main/java/org/drools/jsr94/rules/StatefulRuleSessionImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-jsr94/src/main/java/org/drools/jsr94/rules/StatefulRuleSessionImpl.java	2008-05-30 18:42:27 UTC (rev 20234)
+++ labs/jbossrules/trunk/drools-jsr94/src/main/java/org/drools/jsr94/rules/StatefulRuleSessionImpl.java	2008-05-30 18:46:18 UTC (rev 20235)
@@ -32,6 +32,7 @@
 
 import org.drools.FactException;
 import org.drools.FactHandle;
+import org.drools.SessionConfiguration;
 import org.drools.StatefulSession;
 import org.drools.WorkingMemory;
 import org.drools.jsr94.rules.admin.RuleExecutionSetImpl;
@@ -99,15 +100,17 @@
 
         this.setRuleExecutionSet( ruleSet );
 
-        initSession( true );
+        SessionConfiguration conf = new SessionConfiguration();
+        conf.setKeepReference( true );
+        initSession( conf );
     }
     
     /**
      * Initialize this <code>RuleSession</code>
      * with a new <code>WorkingMemory</code>.
      */
-    protected void initSession(boolean keepReference) {        
-        this.session = this.getRuleExecutionSet().newStatefulSession( keepReference);
+    protected void initSession(SessionConfiguration conf) {        
+        this.session = this.getRuleExecutionSet().newStatefulSession( conf );
 
         final Map props = this.getProperties();
         if ( props != null ) {
@@ -339,7 +342,7 @@
      */
     public void reset() {
         // stateful rule sessions should not be high load, thus safe to keep references
-        initSession( true );
+        initSession( new SessionConfiguration() );
     }
 
     public int getType() throws InvalidRuleSessionException {

Modified: labs/jbossrules/trunk/drools-jsr94/src/main/java/org/drools/jsr94/rules/admin/RuleExecutionSetImpl.java
===================================================================
--- labs/jbossrules/trunk/drools-jsr94/src/main/java/org/drools/jsr94/rules/admin/RuleExecutionSetImpl.java	2008-05-30 18:42:27 UTC (rev 20234)
+++ labs/jbossrules/trunk/drools-jsr94/src/main/java/org/drools/jsr94/rules/admin/RuleExecutionSetImpl.java	2008-05-30 18:46:18 UTC (rev 20235)
@@ -28,6 +28,7 @@
 import org.drools.RuleBase;
 import org.drools.RuleBaseConfiguration;
 import org.drools.RuleIntegrationException;
+import org.drools.SessionConfiguration;
 import org.drools.StatefulSession;
 import org.drools.StatelessSession;
 import org.drools.jsr94.rules.Constants;
@@ -169,8 +170,8 @@
      *
      * @return A new WorkingMemory object.
      */
-    public StatefulSession newStatefulSession(boolean keepReference) {
-        return this.ruleBase.newStatefulSession(keepReference);
+    public StatefulSession newStatefulSession(SessionConfiguration conf) {
+        return this.ruleBase.newStatefulSession(conf);
     }
     
     /**




More information about the jboss-svn-commits mailing list