[jboss-svn-commits] JBL Code SVN: r34121 - in labs/jbossrules/branches/trunk_20100722_esteban_diega: drools-core/src/main/java/org/drools/common and 9 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Thu Jul 22 19:27:57 EDT 2010


Author: diegoll
Date: 2010-07-22 19:27:56 -0400 (Thu, 22 Jul 2010)
New Revision: 34121

Added:
   labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-core/src/main/java/org/drools/time/ProcessJobTriggerService.java
   labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-core/src/main/java/org/drools/time/ProcessTimerPersistenceStrategy.java
   labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-core/src/main/java/org/drools/time/impl/ProcessJobHandle.java
   labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/timer/
   labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/timer/JPACheckerProcessTimerJobService.java
   labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/timer/JPAProcessTimerPersistenceStrategy.java
   labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/timer/ProcessTimerJob.java
   labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-persistence-jpa/src/test/java/org/drools/persistence/processinstance/
   labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-persistence-jpa/src/test/java/org/drools/persistence/processinstance/timer/
   labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-persistence-jpa/src/test/java/org/drools/persistence/processinstance/timer/JPAPersitentTimerServiceTest.java
   labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-persistence-jpa/src/test/java/org/drools/persistence/processinstance/timer/Message.java
   labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-persistence-jpa/src/test/resources/simpleTimer.rf
Modified:
   labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-api/src/main/java/org/drools/runtime/EnvironmentName.java
   labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java
   labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-core/src/main/java/org/drools/time/TimerServiceFactory.java
   labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-core/src/main/java/org/drools/time/impl/IntervalTrigger.java
   labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-core/src/main/java/org/drools/time/impl/JDKTimerService.java
   labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-persistence-jpa/src/test/resources/META-INF/orm.xml
   labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-persistence-jpa/src/test/resources/META-INF/persistence.xml
Log:
added test and initial implementation for persist process timers in an external storage

Modified: labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-api/src/main/java/org/drools/runtime/EnvironmentName.java
===================================================================
--- labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-api/src/main/java/org/drools/runtime/EnvironmentName.java	2010-07-22 22:53:01 UTC (rev 34120)
+++ labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-api/src/main/java/org/drools/runtime/EnvironmentName.java	2010-07-22 23:27:56 UTC (rev 34121)
@@ -13,4 +13,5 @@
     public static final String GLOBALS                              = "drools.Globals";
     public static final String CALENDARS                            = "org.drools.time.Calendars";
     public static final String DATE_FORMATS                         = "org.drools.build.DateFormats";
+	public static final String PROCESS_TIMER_STRATEGY = "org.drools.time.Process";
 }

Modified: labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java
===================================================================
--- labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java	2010-07-22 22:53:01 UTC (rev 34120)
+++ labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-core/src/main/java/org/drools/common/AbstractWorkingMemory.java	2010-07-22 23:27:56 UTC (rev 34121)
@@ -367,7 +367,7 @@
         this.processInstanceManager = config.getProcessInstanceManagerFactory().createProcessInstanceManager( this );
         this.timeMachine = new TimeMachine();
 
-        TimerService timerService = TimerServiceFactory.getTimerService( this.config.getClockType() );
+        TimerService timerService = TimerServiceFactory.getTimerService( this.config.getClockType(), this.environment );
         this.timerManager = new TimerManager( this,
                                               timerService );
         this.signalManager = config.getSignalManagerFactory().createSignalManager( this );

Added: labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-core/src/main/java/org/drools/time/ProcessJobTriggerService.java
===================================================================
--- labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-core/src/main/java/org/drools/time/ProcessJobTriggerService.java	                        (rev 0)
+++ labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-core/src/main/java/org/drools/time/ProcessJobTriggerService.java	2010-07-22 23:27:56 UTC (rev 34121)
@@ -0,0 +1,9 @@
+package org.drools.time;
+
+public interface ProcessJobTriggerService {
+
+	void start();
+
+	void stop();
+
+}

Added: labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-core/src/main/java/org/drools/time/ProcessTimerPersistenceStrategy.java
===================================================================
--- labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-core/src/main/java/org/drools/time/ProcessTimerPersistenceStrategy.java	                        (rev 0)
+++ labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-core/src/main/java/org/drools/time/ProcessTimerPersistenceStrategy.java	2010-07-22 23:27:56 UTC (rev 34121)
@@ -0,0 +1,13 @@
+package org.drools.time;
+
+import org.drools.process.instance.timer.TimerManager.ProcessJobContext;
+import org.drools.time.impl.IntervalTrigger;
+import org.drools.time.impl.ProcessJobHandle;
+
+public interface ProcessTimerPersistenceStrategy {
+
+	void save(ProcessJobContext processContext, IntervalTrigger intervalTrigger);
+
+	boolean remove(ProcessJobHandle jobHandle);
+
+}

Modified: labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-core/src/main/java/org/drools/time/TimerServiceFactory.java
===================================================================
--- labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-core/src/main/java/org/drools/time/TimerServiceFactory.java	2010-07-22 22:53:01 UTC (rev 34120)
+++ labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-core/src/main/java/org/drools/time/TimerServiceFactory.java	2010-07-22 23:27:56 UTC (rev 34121)
@@ -1,18 +1,25 @@
 package org.drools.time;
 
 import org.drools.ClockType;
+import org.drools.runtime.Environment;
+import org.drools.runtime.EnvironmentName;
 import org.drools.time.impl.JDKTimerService;
 import org.drools.time.impl.PseudoClockScheduler;
 
 public class TimerServiceFactory {
+	
+	public static TimerService getTimerService(ClockType type, Environment environment){
+        switch( type ) {
+        case REALTIME_CLOCK:
+            ProcessTimerPersistenceStrategy processTimerPersistenceStrategy = (ProcessTimerPersistenceStrategy) environment.get(EnvironmentName.PROCESS_TIMER_STRATEGY);
+			return new JDKTimerService(processTimerPersistenceStrategy);
+        case PSEUDO_CLOCK:
+            return new PseudoClockScheduler();
+    }
+    throw new IllegalArgumentException("Unknown clock type: " + type.name());
+}
     
     public static TimerService getTimerService( ClockType type ) {
-        switch( type ) {
-            case REALTIME_CLOCK:
-                return new JDKTimerService();
-            case PSEUDO_CLOCK:
-                return new PseudoClockScheduler();
-        }
-        return null;
+    	return getTimerService(type, null);
     }
 }

Modified: labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-core/src/main/java/org/drools/time/impl/IntervalTrigger.java
===================================================================
--- labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-core/src/main/java/org/drools/time/impl/IntervalTrigger.java	2010-07-22 22:53:01 UTC (rev 34120)
+++ labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-core/src/main/java/org/drools/time/impl/IntervalTrigger.java	2010-07-22 23:27:56 UTC (rev 34121)
@@ -21,6 +21,7 @@
     private int       repeatCount;
     private Date      nextFireTime;
     private long      period;
+    private long      delay;
     private String[]  calendarNames;
     private Calendars calendars;
 
@@ -37,6 +38,7 @@
                            String[] calendarNames,
                            Calendars calendars) {
         this.period = period;
+        this.delay = delay;
 
         if ( startTime == null ) {
             startTime = new Date( timestamp );
@@ -191,4 +193,12 @@
             }
         }
     }
+
+	public long getPeriod() {
+		return period;
+	}
+
+	public long getDelay() {
+		return delay;
+	}
 }
\ No newline at end of file

Modified: labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-core/src/main/java/org/drools/time/impl/JDKTimerService.java
===================================================================
--- labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-core/src/main/java/org/drools/time/impl/JDKTimerService.java	2010-07-22 22:53:01 UTC (rev 34120)
+++ labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-core/src/main/java/org/drools/time/impl/JDKTimerService.java	2010-07-22 23:27:56 UTC (rev 34121)
@@ -22,9 +22,11 @@
 import java.util.concurrent.ScheduledThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
 
+import org.drools.process.instance.timer.TimerManager.ProcessJobContext;
 import org.drools.time.Job;
 import org.drools.time.JobContext;
 import org.drools.time.JobHandle;
+import org.drools.time.ProcessTimerPersistenceStrategy;
 import org.drools.time.SessionClock;
 import org.drools.time.TimerService;
 import org.drools.time.Trigger;
@@ -41,13 +43,19 @@
     SessionClock {
     
     private ScheduledThreadPoolExecutor scheduler;
+    private ProcessTimerPersistenceStrategy processTimerPersistenceStrategy;
 
     public JDKTimerService() {
-        this( 1 );
+        this( null );
     }
+    
+    public JDKTimerService(ProcessTimerPersistenceStrategy processTimerPersistenceStrategy){
+    	this(1, processTimerPersistenceStrategy);
+    }
 
-    public JDKTimerService(int size) {
+    public JDKTimerService(int size, ProcessTimerPersistenceStrategy processTimerPersistenceStrategy) {
         this.scheduler = new ScheduledThreadPoolExecutor( size );
+        this.processTimerPersistenceStrategy = processTimerPersistenceStrategy;
     }
 
     /**
@@ -67,28 +75,41 @@
     public JobHandle scheduleJob(Job job,
                                  JobContext ctx,
                                  Trigger trigger) {
-        JDKJobHandle jobHandle = new JDKJobHandle();
 
         Date date = trigger.nextFireTime();
 
         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;
+        	if( null != getProcessTimerPersistenceStrategy() 
+        			&& ctx instanceof ProcessJobContext
+        			&& trigger instanceof IntervalTrigger){
+        		ProcessJobContext processContext = (ProcessJobContext) ctx;
+        		IntervalTrigger intervalTrigger = (IntervalTrigger) trigger;
+        		ProcessJobHandle jobHandle = new ProcessJobHandle();
+        		jobHandle.setProcessId(processContext.getProcessInstanceId());
+        		getProcessTimerPersistenceStrategy().save(processContext, intervalTrigger);
+        		return jobHandle;
+        	}else {
+                JDKJobHandle jobHandle = new JDKJobHandle();
+	            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) {
+    	if(null != getProcessTimerPersistenceStrategy() && jobHandle instanceof ProcessJobHandle)
+    		return getProcessTimerPersistenceStrategy().remove((ProcessJobHandle)jobHandle);
         return this.scheduler.remove( (Runnable) ((JDKJobHandle) jobHandle).getFuture() );
     }
 
@@ -172,4 +193,13 @@
         return 0;
     }
 
+	public ProcessTimerPersistenceStrategy getProcessTimerPersistenceStrategy() {
+		return processTimerPersistenceStrategy;
+	}
+
+	public void setProcessTimerPersistenceStrategy(
+			ProcessTimerPersistenceStrategy processTimerPersistenceStrategy) {
+		this.processTimerPersistenceStrategy = processTimerPersistenceStrategy;
+	}
+
 }

Added: labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-core/src/main/java/org/drools/time/impl/ProcessJobHandle.java
===================================================================
--- labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-core/src/main/java/org/drools/time/impl/ProcessJobHandle.java	                        (rev 0)
+++ labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-core/src/main/java/org/drools/time/impl/ProcessJobHandle.java	2010-07-22 23:27:56 UTC (rev 34121)
@@ -0,0 +1,17 @@
+package org.drools.time.impl;
+
+import org.drools.time.JobHandle;
+
+public class ProcessJobHandle implements JobHandle {
+
+	private long processId;
+	
+	public long getProcessId() {
+		return processId;
+	}
+
+	public void setProcessId(long processId) {
+		this.processId = processId;
+	}
+
+}

Added: labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/timer/JPACheckerProcessTimerJobService.java
===================================================================
--- labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/timer/JPACheckerProcessTimerJobService.java	                        (rev 0)
+++ labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/timer/JPACheckerProcessTimerJobService.java	2010-07-22 23:27:56 UTC (rev 34121)
@@ -0,0 +1,123 @@
+package org.drools.persistence.processinstance.timer;
+
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.Persistence;
+
+import org.drools.KnowledgeBase;
+import org.drools.command.impl.CommandBasedStatefulKnowledgeSession;
+import org.drools.command.impl.KnowledgeCommandContext;
+import org.drools.impl.EnvironmentFactory;
+import org.drools.impl.StatefulKnowledgeSessionImpl;
+import org.drools.persistence.jpa.JPAKnowledgeService;
+import org.drools.process.instance.event.SignalManager;
+import org.drools.process.instance.timer.TimerInstance;
+import org.drools.runtime.Environment;
+import org.drools.runtime.EnvironmentName;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.time.ProcessJobTriggerService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import bitronix.tm.TransactionManagerServices;
+
+public class JPACheckerProcessTimerJobService implements
+		ProcessJobTriggerService{
+
+	private final class CheckExternalTimers implements Runnable {
+		public void run() {
+			while(isRunning()){
+				logger.debug("checking queued jobs");
+				try {
+					for (ProcessTimerJob processJob : getProcessTimerJobs()) {
+						if(shouldExecuteJob(processJob)){
+							logger.debug("executing job");
+							executeJob(processJob);
+						}
+					}
+					Thread.sleep(getPoolingTime());
+				} catch (InterruptedException e) {
+					setRunning(false);
+				}
+			}
+			logger.info("external timer checker stopped");
+		}
+	}
+
+	private static Logger logger = LoggerFactory.getLogger(JPACheckerProcessTimerJobService.class);
+	private static final long DEFAULT_POOLING_TIME = 1000;
+	
+	private EntityManagerFactory entityManagerFactory;
+	private KnowledgeBase kbase;
+	private int sessionId;
+	private boolean running = false;
+	private long poolingTime = DEFAULT_POOLING_TIME;
+	
+	public JPACheckerProcessTimerJobService(int sessionId, KnowledgeBase kbase) {
+		this.entityManagerFactory = Persistence.createEntityManagerFactory("org.drools.persistence.jpa");
+		this.sessionId = sessionId;
+		this.kbase = kbase;
+	}
+
+	public void start() {
+		logger.info("Starting external timer checker");
+		if(!isRunning()){
+			setRunning(true);
+			new Thread(new CheckExternalTimers(), "checker").start();
+		}
+	}
+	
+	public void startSynchronously(){
+		setRunning(true);
+		new CheckExternalTimers().run();
+	}
+
+	private void executeJob(ProcessTimerJob processJob) {
+		//StatefulKnowledgeSessionImpl sessionImpl = (StatefulKnowledgeSessionImpl) this.ksession;
+		Environment environment = EnvironmentFactory.newEnvironment();
+		environment.set(EnvironmentName.ENTITY_MANAGER_FACTORY, Persistence.createEntityManagerFactory("org.drools.persistence.jpa"));
+		environment.set(EnvironmentName.TRANSACTION_MANAGER, TransactionManagerServices.getTransactionManager());
+
+		StatefulKnowledgeSession ksession = JPAKnowledgeService.loadStatefulKnowledgeSession(sessionId, kbase, null, environment);
+		StatefulKnowledgeSessionImpl sessionImpl = (StatefulKnowledgeSessionImpl) ((KnowledgeCommandContext) ((CommandBasedStatefulKnowledgeSession)ksession).getCommandService().getContext()).getStatefulKnowledgesession();
+        SignalManager signalManager = sessionImpl.getInternalWorkingMemory().getSignalManager();
+		TimerInstance timerInstance = processJob.getTimerInstance();
+		signalManager.signalEvent( processJob.getProcessId(), "timerTriggered",  timerInstance );
+	}
+
+	private boolean shouldExecuteJob(ProcessTimerJob processJob) {
+		return true;
+	}
+
+	public void stop() {
+		logger.info("stoping external timer checker");
+		setRunning(false);
+	}
+
+	public EntityManager getEntityManager() {
+		return entityManagerFactory.createEntityManager();
+	}
+
+	public long getPoolingTime() {
+		return poolingTime;
+	}
+
+	public void setPoolingTime(long poolingTime) {
+		this.poolingTime = poolingTime;
+	}
+
+	private boolean isRunning() {
+		return running;
+	}
+
+	private void setRunning(boolean running) {
+		this.running = running;
+	}
+	
+	@SuppressWarnings("unchecked")
+	private List<ProcessTimerJob> getProcessTimerJobs(){
+		return getEntityManager().createQuery("from ProcessTimerJob").getResultList();
+	}
+}

Added: labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/timer/JPAProcessTimerPersistenceStrategy.java
===================================================================
--- labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/timer/JPAProcessTimerPersistenceStrategy.java	                        (rev 0)
+++ labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/timer/JPAProcessTimerPersistenceStrategy.java	2010-07-22 23:27:56 UTC (rev 34121)
@@ -0,0 +1,40 @@
+package org.drools.persistence.processinstance.timer;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+
+import org.drools.process.instance.timer.TimerManager.ProcessJobContext;
+import org.drools.time.ProcessTimerPersistenceStrategy;
+import org.drools.time.impl.IntervalTrigger;
+import org.drools.time.impl.ProcessJobHandle;
+
+public class JPAProcessTimerPersistenceStrategy implements
+		ProcessTimerPersistenceStrategy {
+
+	private EntityManagerFactory entityManagerFactory;
+
+	public JPAProcessTimerPersistenceStrategy(EntityManagerFactory emf) {
+		this.entityManagerFactory = emf;
+	}
+
+	public void save(ProcessJobContext processContext, IntervalTrigger intervalTrigger) {
+		ProcessTimerJob timerJob = new ProcessTimerJob();
+		timerJob.setProcessId(processContext.getProcessInstanceId());
+		timerJob.setInitialTime(intervalTrigger.getStartTime().getTime());
+		timerJob.setPeriod(intervalTrigger.getPeriod());
+		timerJob.setDelay(intervalTrigger.getDelay());
+		timerJob.setTimerInstance(processContext.getTimer());
+
+		getEntityManager().persist(timerJob);
+	}
+
+	public boolean remove(ProcessJobHandle jobHandle) {
+		return getEntityManager().createQuery("delete ProcessTimerJob where processId=:processId")
+		.setParameter("processId", jobHandle.getProcessId())
+		.executeUpdate() == 1;
+	}
+
+	public EntityManager getEntityManager() {
+		return entityManagerFactory.createEntityManager();
+	}
+}

Added: labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/timer/ProcessTimerJob.java
===================================================================
--- labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/timer/ProcessTimerJob.java	                        (rev 0)
+++ labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-persistence-jpa/src/main/java/org/drools/persistence/processinstance/timer/ProcessTimerJob.java	2010-07-22 23:27:56 UTC (rev 34121)
@@ -0,0 +1,74 @@
+package org.drools.persistence.processinstance.timer;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.OneToOne;
+
+import org.drools.process.instance.timer.TimerInstance;
+
+ at Entity
+public class ProcessTimerJob {
+
+	private long id;
+	private long processId;
+	private long initialTime;
+	private long period;
+	private long delay;
+	private TimerInstance timerInstance;
+
+	@Id
+	@GeneratedValue(strategy=GenerationType.AUTO)
+	public long getId() {
+		return id;
+	}
+
+	public void setId(long id) {
+		this.id = id;
+	}
+
+	public long getProcessId() {
+		return processId;
+	}
+
+	public void setProcessId(long processId) {
+		this.processId = processId;
+	}
+
+	public long getInitialTime() {
+		return initialTime;
+	}
+
+	public void setInitialTime(long initialTime) {
+		this.initialTime = initialTime;
+	}
+
+	public long getPeriod() {
+		return period;
+	}
+
+	public void setPeriod(long period) {
+		this.period = period;
+	}
+
+	public long getDelay() {
+		return delay;
+	}
+
+	public void setDelay(long delay) {
+		this.delay = delay;
+	}
+
+	@OneToOne(fetch=FetchType.EAGER, cascade=CascadeType.ALL)
+	public TimerInstance getTimerInstance() {
+		return timerInstance;
+	}
+
+	public void setTimerInstance(TimerInstance timerInstance) {
+		this.timerInstance = timerInstance;
+	}
+
+}

Added: labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-persistence-jpa/src/test/java/org/drools/persistence/processinstance/timer/JPAPersitentTimerServiceTest.java
===================================================================
--- labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-persistence-jpa/src/test/java/org/drools/persistence/processinstance/timer/JPAPersitentTimerServiceTest.java	                        (rev 0)
+++ labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-persistence-jpa/src/test/java/org/drools/persistence/processinstance/timer/JPAPersitentTimerServiceTest.java	2010-07-22 23:27:56 UTC (rev 34121)
@@ -0,0 +1,140 @@
+package org.drools.persistence.processinstance.timer;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.naming.InitialContext;
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.NoResultException;
+import javax.persistence.Persistence;
+import javax.transaction.UserTransaction;
+
+import junit.framework.TestCase;
+
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseFactory;
+import org.drools.Message;
+import org.drools.builder.KnowledgeBuilder;
+import org.drools.builder.KnowledgeBuilderError;
+import org.drools.builder.KnowledgeBuilderFactory;
+import org.drools.builder.ResourceType;
+import org.drools.impl.EnvironmentFactory;
+import org.drools.io.ResourceFactory;
+import org.drools.persistence.jpa.JPAKnowledgeService;
+import org.drools.runtime.Environment;
+import org.drools.runtime.EnvironmentName;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.drools.runtime.process.ProcessInstance;
+import org.junit.Assert;
+
+import bitronix.tm.TransactionManagerServices;
+import bitronix.tm.resource.jdbc.PoolingDataSource;
+
+public class JPAPersitentTimerServiceTest extends TestCase{
+
+	private EntityManagerFactory emf;
+    private PoolingDataSource ds1;
+	
+	protected void setUp() {
+		startDataSource();
+		emf = Persistence.createEntityManagerFactory("org.drools.persistence.jpa");
+	}
+
+	private void startDataSource() {
+		ds1 = new PoolingDataSource();
+        ds1.setUniqueName("jdbc/testDS1");
+        ds1.setClassName( "org.h2.jdbcx.JdbcDataSource" );
+        ds1.setMaxPoolSize( 3 );
+        ds1.setAllowLocalTransactions( true );
+        ds1.getDriverProperties().put( "user",
+                                       "sa" );
+        ds1.getDriverProperties().put( "password",
+                                       "sasa" );
+        ds1.getDriverProperties().put( "URL",
+                                       "jdbc:h2:mem:mydb" );
+        ds1.init();
+	}
+
+	protected void tearDown() {
+		emf.close();
+		ds1.close();
+	}
+	
+	public void testProcessTimerPersisted() throws Exception{
+		EntityManager entityManager = emf.createEntityManager();
+        KnowledgeBase kbase = getKnowledgeBase();
+		StatefulKnowledgeSession ksession = createKnowledgeSession(kbase);
+
+        assertTrue("timers queued at begin", entityManager.createQuery("from ProcessTimerJob").getResultList().isEmpty());
+        ksession.setGlobal("myList", new ArrayList<Message>());
+        ksession.startProcess("com.plugtree.timer");
+        ProcessTimerJob uniquePersistedTimer = null;
+        try{
+        	uniquePersistedTimer = (ProcessTimerJob) entityManager.createQuery("from ProcessTimerJob").getSingleResult();
+        } catch (NoResultException nre){
+        	fail("no timer persisted");
+        }
+        
+        assertNotNull("timer id not persisted", uniquePersistedTimer.getTimerInstance());
+
+        ksession.dispose();
+	}
+	
+	public void testTimerTriggered() throws Exception{
+		EntityManagerFactory emf = Persistence.createEntityManagerFactory("org.drools.persistence.jpa");
+
+		EntityManager entityManager = emf.createEntityManager();
+        KnowledgeBase kbase = getKnowledgeBase();
+		StatefulKnowledgeSession ksession = createKnowledgeSession(kbase);
+
+		JPACheckerProcessTimerJobService jpaTimerChecker = new JPACheckerProcessTimerJobService(ksession.getId(), kbase);
+        jpaTimerChecker.start();
+
+        List<Message> myList = new ArrayList<Message>();
+        ksession.setGlobal("myList", myList);
+        ProcessInstance processInstance = ksession.startProcess("com.plugtree.timer");
+        Assert.assertEquals(0, myList.size());
+        Assert.assertEquals(ProcessInstance.STATE_ACTIVE, processInstance.getState());
+
+        ProcessTimerJob uniquePersistedTimer = null;
+        try{
+        	uniquePersistedTimer = (ProcessTimerJob) entityManager.createQuery("from ProcessTimerJob").getSingleResult();
+        } catch (NoResultException nre){
+        	fail("no timer persisted");
+        }
+        Thread.sleep(6000);
+
+        Assert.assertEquals(5, myList.size());
+        ksession.dispose();
+        jpaTimerChecker.stop();
+	}
+
+	private StatefulKnowledgeSession createKnowledgeSession(KnowledgeBase kbase) {
+		Environment environment = EnvironmentFactory.newEnvironment();
+		environment.set(EnvironmentName.ENTITY_MANAGER_FACTORY, Persistence.createEntityManagerFactory("org.drools.persistence.jpa"));
+		environment.set(EnvironmentName.TRANSACTION_MANAGER, TransactionManagerServices.getTransactionManager());
+		environment.set(EnvironmentName.PROCESS_TIMER_STRATEGY, new JPAProcessTimerPersistenceStrategy(emf));
+
+        StatefulKnowledgeSession ksession = JPAKnowledgeService.newStatefulKnowledgeSession(kbase, null, environment);
+        //StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(null, environment);
+		return ksession;
+	}
+
+	private KnowledgeBase getKnowledgeBase() {
+		KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
+
+        kbuilder.add(ResourceFactory.newClassPathResource("simpleTimer.rf"), ResourceType.DRF);
+        if (kbuilder.hasErrors()) {
+        	StringBuilder builder = new StringBuilder();
+        	for (KnowledgeBuilderError error : kbuilder.getErrors()) {
+				builder.append(error.getMessage()+"\n");
+			}
+            fail(builder.toString());
+        }
+        
+        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
+        kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
+		return kbase;
+	}
+}

Added: labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-persistence-jpa/src/test/java/org/drools/persistence/processinstance/timer/Message.java
===================================================================
--- labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-persistence-jpa/src/test/java/org/drools/persistence/processinstance/timer/Message.java	                        (rev 0)
+++ labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-persistence-jpa/src/test/java/org/drools/persistence/processinstance/timer/Message.java	2010-07-22 23:27:56 UTC (rev 34121)
@@ -0,0 +1,121 @@
+package org.drools.persistence.processinstance.timer;
+/**
+ * 
+ */
+
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+public class Message implements Serializable {
+
+    private String          message1 = "One";
+    private String          message2 = "Two";
+    private String          message3 = "Three";
+    private String          message4 = "Four";
+
+    public static final int HELLO    = 0;
+    public static final int GOODBYE  = 1;
+
+    private String          message;
+
+    private int             status;
+
+    private List    list     = new ArrayList();
+    private int     number   = 0;
+    private Date    birthday = new Date();
+    private boolean fired    = false;
+
+    public Message() {
+    }
+
+    public Message(final String msg) {
+        this.message = msg;
+    }
+
+    public String getMessage() {
+        return this.message;
+    }
+
+    public void setMessage(final String message) {
+        this.message = message;
+    }
+
+    public int getStatus() {
+        return this.status;
+    }
+
+    public void setStatus(final int status) {
+        this.status = status;
+    }
+
+    public String getMessage1() {
+        return this.message1;
+    }
+
+    public void setMessage1(final String message1) {
+        this.message1 = message1;
+    }
+
+    public String getMessage2() {
+        return this.message2;
+    }
+
+    public void setMessage2(final String message2) {
+        this.message2 = message2;
+    }
+
+    public String getMessage3() {
+        return this.message3;
+    }
+
+    public void setMessage3(final String message3) {
+        this.message3 = message3;
+    }
+
+    public String getMessage4() {
+        return this.message4;
+    }
+
+    public void setMessage4(final String message4) {
+        this.message4 = message4;
+    }
+
+    public boolean isFired() {
+        return this.fired;
+    }
+
+    public void setFired(final boolean fired) {
+        this.fired = fired;
+    }
+
+    public Date getBirthday() {
+        return this.birthday;
+    }
+
+    public void setBirthday(final Date birthday) {
+        this.birthday = birthday;
+    }
+
+    public int getNumber() {
+        return this.number;
+    }
+
+    public void setNumber(final int number) {
+        this.number = number;
+    }
+
+    public List getList() {
+        return this.list;
+    }
+
+    public void setList(final List list) {
+        this.list = list;
+    }
+
+    public void addToList(final String s) {
+        this.list.add( s );
+    }
+}
\ No newline at end of file

Modified: labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-persistence-jpa/src/test/resources/META-INF/orm.xml
===================================================================
--- labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-persistence-jpa/src/test/resources/META-INF/orm.xml	2010-07-22 22:53:01 UTC (rev 34120)
+++ labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-persistence-jpa/src/test/resources/META-INF/orm.xml	2010-07-22 23:27:56 UTC (rev 34121)
@@ -13,4 +13,12 @@
     :type in elements(processInstanceInfo.eventTypes)
           </query>
       </named-query>
+
+  <entity class="org.drools.process.instance.timer.TimerInstance">
+  	<attributes>
+  	  <id name="id"/>
+  	  <transient name="jobHandle"/>
+  	</attributes>
+  </entity>
+
 </entity-mappings>

Modified: labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-persistence-jpa/src/test/resources/META-INF/persistence.xml
===================================================================
--- labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-persistence-jpa/src/test/resources/META-INF/persistence.xml	2010-07-22 22:53:01 UTC (rev 34120)
+++ labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-persistence-jpa/src/test/resources/META-INF/persistence.xml	2010-07-22 23:27:56 UTC (rev 34121)
@@ -18,11 +18,14 @@
     <class>org.drools.persistence.processinstance.variabletypes.VariableInstanceInfo</class>
     <class>org.drools.persistence.processinstance.variabletypes.SerializablePersistedVariable</class>
     <class>org.drools.persistence.processinstance.WorkItemInfo</class>
+    
+    <class>org.drools.persistence.processinstance.timer.ProcessTimerJob</class>
+    
 	    <properties>
 	        <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>	        
 	        <property name="hibernate.max_fetch_depth" value="3"/>
 		    <property name="hibernate.hbm2ddl.auto" value="update" />
-            <property name="hibernate.show_sql" value="false" />	
+            <property name="hibernate.show_sql" value="true" />	
             <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.BTMTransactionManagerLookup" />
 	    </properties>        
     </persistence-unit>

Added: labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-persistence-jpa/src/test/resources/simpleTimer.rf
===================================================================
--- labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-persistence-jpa/src/test/resources/simpleTimer.rf	                        (rev 0)
+++ labs/jbossrules/branches/trunk_20100722_esteban_diega/drools-persistence-jpa/src/test/resources/simpleTimer.rf	2010-07-22 23:27:56 UTC (rev 34121)
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?> 
+<process xmlns="http://drools.org/drools-5.0/process"
+         xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
+         xs:schemaLocation="http://drools.org/drools-5.0/process drools-processes-5.0.xsd"
+         type="RuleFlow" name="flow" id="com.plugtree.timer" package-name="com.plugtree" version="1">
+  <header>
+    <imports>
+      <import name="org.drools.persistence.processinstance.timer.Message" />
+    </imports>
+    <globals>
+      <global identifier="myList" type="java.util.List" />
+    </globals>
+  </header>
+
+  <nodes>
+    <start id="1" name="Start" x="96" y="96" width="48" height="48" />
+    <timerNode id="2" name="Timer" x="228" y="96" width="48" height="48" delay="800ms" period="200ms" />
+    <actionNode id="3" name="Action" x="348" y="96" width="80" height="48" >
+      <action type="expression" dialect="java" >
+        System.out.println("Triggered");
+        myList.add( new Message() );
+        insert( new Message() );
+      </action>
+    </actionNode>
+    <milestone id="4" name="Wait" x="504" y="96" width="80" height="48" >
+      <constraint type="rule" dialect="mvel" >
+        Number( intValue &gt;= 5 ) from accumulate ( m: Message( ), count( m ) )
+      </constraint>
+    </milestone>
+    <end id="5" name="End" x="648" y="96" width="48" height="48" />
+  </nodes>
+
+  <connections>
+    <connection from="1" to="2" />
+    <connection from="2" to="3" />
+    <connection from="3" to="4" />
+    <connection from="4" to="5" />
+  </connections>
+
+</process>
\ No newline at end of file



More information about the jboss-svn-commits mailing list