[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 >= 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