[jboss-svn-commits] JBL Code SVN: r34725 - in labs/jbossrules/branches/5_1_20100802_esteban_diega/drools-process/drools-persistent-timer: drools-timer-messages/src/main/java/org/drools/timer/message and 4 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Sat Aug 14 19:13:05 EDT 2010


Author: diegoll
Date: 2010-08-14 19:13:05 -0400 (Sat, 14 Aug 2010)
New Revision: 34725

Modified:
   labs/jbossrules/branches/5_1_20100802_esteban_diega/drools-process/drools-persistent-timer/drools-timer-core/src/test/java/org/drools/timer/test/PersistentTimerProcessTest.java
   labs/jbossrules/branches/5_1_20100802_esteban_diega/drools-process/drools-persistent-timer/drools-timer-messages/src/main/java/org/drools/timer/message/TimerMessage.java
   labs/jbossrules/branches/5_1_20100802_esteban_diega/drools-process/drools-persistent-timer/drools-timer-persistence/src/main/java/org/drools/timer/persistence/JPATimerPersistence.java
   labs/jbossrules/branches/5_1_20100802_esteban_diega/drools-process/drools-persistent-timer/drools-timer-persistence/src/main/java/org/drools/timer/persistence/model/TimerState.java
   labs/jbossrules/branches/5_1_20100802_esteban_diega/drools-process/drools-persistent-timer/drools-timer-scheduler/src/main/java/org/drools/timer/scheduler/job/TimerExecutorJob.java
   labs/jbossrules/branches/5_1_20100802_esteban_diega/drools-process/drools-persistent-timer/drools-timer-scheduler/src/test/java/org/drools/timer/scheduler/TimerSchedulerServiceTest.java
Log:
[JBRULES-2616] implemented transactional behavior between main process and the scheduler

Modified: labs/jbossrules/branches/5_1_20100802_esteban_diega/drools-process/drools-persistent-timer/drools-timer-core/src/test/java/org/drools/timer/test/PersistentTimerProcessTest.java
===================================================================
--- labs/jbossrules/branches/5_1_20100802_esteban_diega/drools-process/drools-persistent-timer/drools-timer-core/src/test/java/org/drools/timer/test/PersistentTimerProcessTest.java	2010-08-14 23:12:03 UTC (rev 34724)
+++ labs/jbossrules/branches/5_1_20100802_esteban_diega/drools-process/drools-persistent-timer/drools-timer-core/src/test/java/org/drools/timer/test/PersistentTimerProcessTest.java	2010-08-14 23:13:05 UTC (rev 34725)
@@ -27,7 +27,7 @@
 
 public class PersistentTimerProcessTest {
     
-    private static final String H2_DB_NAME = "persistentTimersTest"; 
+    private static final String H2_DB_NAME = "integrationTest"; 
     private static final Logger logger = LoggerFactory.getLogger(PersistentTimerProcessTest.class);
     private static Server h2Server;
     
@@ -78,7 +78,7 @@
         long processId = ksession.startProcess("timerProcess").getId();
         ksession.dispose();
         
-        Thread.sleep(10000); // let the scheduler trigger the jobs
+        Thread.sleep(15000); // let the scheduler trigger the jobs
         
         //check process ended
         ksession = sessionManager.loadSession(sessionId);

Modified: labs/jbossrules/branches/5_1_20100802_esteban_diega/drools-process/drools-persistent-timer/drools-timer-messages/src/main/java/org/drools/timer/message/TimerMessage.java
===================================================================
--- labs/jbossrules/branches/5_1_20100802_esteban_diega/drools-process/drools-persistent-timer/drools-timer-messages/src/main/java/org/drools/timer/message/TimerMessage.java	2010-08-14 23:12:03 UTC (rev 34724)
+++ labs/jbossrules/branches/5_1_20100802_esteban_diega/drools-process/drools-persistent-timer/drools-timer-messages/src/main/java/org/drools/timer/message/TimerMessage.java	2010-08-14 23:13:05 UTC (rev 34725)
@@ -4,13 +4,13 @@
 
 	private static final long serialVersionUID = 1L;
 
-	private Long processInstanceId;
+	private long processInstanceId;
 
-	public Long getProcessInstanceId() {
+	public long getProcessInstanceId() {
 		return processInstanceId;
 	}
 
-	public void setProcessInstanceId(Long processInstanceId) {
+	public void setProcessInstanceId(long processInstanceId) {
 		this.processInstanceId = processInstanceId;
 	}
 

Modified: labs/jbossrules/branches/5_1_20100802_esteban_diega/drools-process/drools-persistent-timer/drools-timer-persistence/src/main/java/org/drools/timer/persistence/JPATimerPersistence.java
===================================================================
--- labs/jbossrules/branches/5_1_20100802_esteban_diega/drools-process/drools-persistent-timer/drools-timer-persistence/src/main/java/org/drools/timer/persistence/JPATimerPersistence.java	2010-08-14 23:12:03 UTC (rev 34724)
+++ labs/jbossrules/branches/5_1_20100802_esteban_diega/drools-process/drools-persistent-timer/drools-timer-persistence/src/main/java/org/drools/timer/persistence/JPATimerPersistence.java	2010-08-14 23:13:05 UTC (rev 34725)
@@ -2,7 +2,6 @@
 
 import javax.persistence.EntityManager;
 import javax.persistence.EntityManagerFactory;
-import javax.persistence.EntityTransaction;
 import javax.persistence.NoResultException;
 
 import org.drools.timer.persistence.model.TimerState;
@@ -16,7 +15,10 @@
 	private EntityManagerFactory entityManagerFactory;
 
 	public void save(TimerState object) {
-	    getEntityManager().persist(object);
+	    EntityManager entityManager = getEntityManager();
+	    entityManager.joinTransaction();
+	    entityManager.persist(object);
+        logger.debug("Saved timer for process instance " + object.getProcessInstanceId());
 	}
 
 	public boolean isExecutable(final long processInstanceId) {
@@ -38,12 +40,10 @@
 	public boolean remove(long processInstanceId) {
 	    EntityManager entityManager = getEntityManager();
 	    try{
-	        EntityTransaction transaction = entityManager.getTransaction();
-            transaction.begin();
+	        entityManager.joinTransaction();
             boolean removed = entityManager.createQuery("delete TimerState where processInstanceId=:processId")
                    .setParameter("processId", processInstanceId)
                    .executeUpdate() == 1;
-            transaction.commit();
     	    logger.debug("Removed timer for process instance " + processInstanceId);
     	    return removed;
 	    } catch (RuntimeException e) {

Modified: labs/jbossrules/branches/5_1_20100802_esteban_diega/drools-process/drools-persistent-timer/drools-timer-persistence/src/main/java/org/drools/timer/persistence/model/TimerState.java
===================================================================
--- labs/jbossrules/branches/5_1_20100802_esteban_diega/drools-process/drools-persistent-timer/drools-timer-persistence/src/main/java/org/drools/timer/persistence/model/TimerState.java	2010-08-14 23:12:03 UTC (rev 34724)
+++ labs/jbossrules/branches/5_1_20100802_esteban_diega/drools-process/drools-persistent-timer/drools-timer-persistence/src/main/java/org/drools/timer/persistence/model/TimerState.java	2010-08-14 23:13:05 UTC (rev 34725)
@@ -8,23 +8,23 @@
 @Entity
 public class TimerState {
 
-	private Integer id;
-	private Long processInstanceId;
+	private long id;
+	private long processInstanceId;
 	private long timerId;
 	private boolean executed;
 
 	@Id
 	@GeneratedValue(strategy=GenerationType.AUTO)
-	public Integer getId() {
+	public long getId() {
 		return id;
 	}
-	public void setId(Integer id) {
+	public void setId(long id) {
 		this.id = id;
 	}
-	public Long getProcessInstanceId() {
+	public long getProcessInstanceId() {
 		return processInstanceId;
 	}
-	public void setProcessInstanceId(Long processInstanceId) {
+	public void setProcessInstanceId(long processInstanceId) {
 		this.processInstanceId = processInstanceId;
 	}
 	public boolean isExecuted() {

Modified: labs/jbossrules/branches/5_1_20100802_esteban_diega/drools-process/drools-persistent-timer/drools-timer-scheduler/src/main/java/org/drools/timer/scheduler/job/TimerExecutorJob.java
===================================================================
--- labs/jbossrules/branches/5_1_20100802_esteban_diega/drools-process/drools-persistent-timer/drools-timer-scheduler/src/main/java/org/drools/timer/scheduler/job/TimerExecutorJob.java	2010-08-14 23:12:03 UTC (rev 34724)
+++ labs/jbossrules/branches/5_1_20100802_esteban_diega/drools-process/drools-persistent-timer/drools-timer-scheduler/src/main/java/org/drools/timer/scheduler/job/TimerExecutorJob.java	2010-08-14 23:13:05 UTC (rev 34725)
@@ -6,6 +6,7 @@
 import java.util.Date;
 
 import org.drools.timer.message.TimerJob;
+import org.drools.timer.persistence.TimerPersistence;
 import org.hornetq.api.core.HornetQException;
 import org.hornetq.api.core.client.ClientMessage;
 import org.hornetq.api.core.client.ClientProducer;
@@ -32,19 +33,27 @@
 
 	public static final String TIMER_EXECUTOR_CONNECTOR = "timerExecutorConnector";
 	public static final String TIMER_EXECUTOR_SESSION = "timerExecutorSession";
+    public static final String TIMER_PERSISTENCE = "timerPersistence";
 
 	public void execute(JobExecutionContext context) throws JobExecutionException {
-	    logger.debug("Executing scheduled timer");
-	    
+	    JobDataMap data = context.getJobDetail().getJobDataMap();
+	    long processInstanceId = data.getLong(PROCESS_INSTANCE_ID);
+	    long timerId = data.getLong(TIMER_ID);
+	    TimerPersistence timerPersistence = (TimerPersistence) data.get(TIMER_PERSISTENCE);
+	    if(!timerPersistence.exists(timerId, processInstanceId)){
+	        logger.warn("Attempt to execute job without a persistent timer. "
+	        		+ "Process ID: " + processInstanceId
+	                + "Timer ID: " + timerId);
+	        return;
+	    }
+        logger.debug("Executing scheduled timer");
+
 	    long period = ((SimpleTrigger)context.getTrigger()).getRepeatInterval();
-		JobDataMap data = context.getJobDetail().getJobDataMap();
-		long processInstanceId = data.getLong(PROCESS_INSTANCE_ID);
 		int sessionId = data.getInt(KSESSION_ID);
 	    String runtimeSessionConfiguratorBeanName = data.getString(SESSION_CONFIGURATION);
 	    String knowledgeStoreServiceBeanName = data.getString(KSTORE);
 	    String knowledgeBaseBeanName = data.getString(KBASE);
 	    String environmentBeanName = data.getString(ENV);
-	    long timerId = data.getLong(TIMER_ID);
 
 		ClientProducer producer = (ClientProducer) data.get(TIMER_EXECUTOR_CONNECTOR);
 		ClientSession session = (ClientSession) data.get(TIMER_EXECUTOR_SESSION);

Modified: labs/jbossrules/branches/5_1_20100802_esteban_diega/drools-process/drools-persistent-timer/drools-timer-scheduler/src/test/java/org/drools/timer/scheduler/TimerSchedulerServiceTest.java
===================================================================
--- labs/jbossrules/branches/5_1_20100802_esteban_diega/drools-process/drools-persistent-timer/drools-timer-scheduler/src/test/java/org/drools/timer/scheduler/TimerSchedulerServiceTest.java	2010-08-14 23:12:03 UTC (rev 34724)
+++ labs/jbossrules/branches/5_1_20100802_esteban_diega/drools-process/drools-persistent-timer/drools-timer-scheduler/src/test/java/org/drools/timer/scheduler/TimerSchedulerServiceTest.java	2010-08-14 23:13:05 UTC (rev 34725)
@@ -3,10 +3,12 @@
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 
+import javax.persistence.EntityManager;
 import javax.persistence.EntityManagerFactory;
 
 import org.drools.timer.message.TimerJob;
 import org.drools.timer.message.impl.InsertScheduledTimerMessage;
+import org.drools.timer.persistence.model.TimerState;
 import org.drools.timer.scheduler.utils.HornetQMessageTranslator;
 import org.h2.tools.DeleteDbFiles;
 import org.h2.tools.Server;
@@ -53,9 +55,15 @@
         HornetQMessageTranslator<TimerJob> executorTranslator =  (HornetQMessageTranslator<TimerJob>) schedulerContext.getBean("messageTranslator");
         
         long scheduledPeriod = 1000;
-        scheduleJob(schedulerProducer, schedulerTranslator, scheduledPeriod);
+        long processInstanceId = 1L;
+        long timerId = 1L;
+        
+        scheduleJob(schedulerProducer, schedulerTranslator, scheduledPeriod, processInstanceId, timerId);
         Thread.sleep(2000);
         
+        insertTimerState(entityManagerFactoryForTest, processInstanceId, timerId);
+        Thread.sleep(2000);
+        
         TimerJob timerJob = executorTranslator.readMessage(timerJobsConsumer.receive());
         Assert.assertEquals(scheduledPeriod, timerJob.getPeriod());
         
@@ -64,10 +72,21 @@
         schedulerContext.close();
     }
 
-    private void scheduleJob(ClientProducer schedulerProducer, HornetQMessageTranslator<InsertScheduledTimerMessage> schedulerTranslator, long period) throws HornetQException {
+    private void insertTimerState(EntityManagerFactory entityManagerFactory, long processInstanceId, long timerId) {
+        EntityManager entityManager = entityManagerFactory.createEntityManager();
+        TimerState timerState = new TimerState();
+        timerState.setTimerId(timerId);
+        timerState.setProcessInstanceId(processInstanceId);
+        entityManager.getTransaction().begin();
+        entityManager.persist(timerState);
+        entityManager.getTransaction().commit();
+    }
+
+    private void scheduleJob(ClientProducer schedulerProducer, HornetQMessageTranslator<InsertScheduledTimerMessage> schedulerTranslator, long period, long processInstanceId, long timerId) throws HornetQException {
         InsertScheduledTimerMessage scheduleTimerMessage = new InsertScheduledTimerMessage();
+        scheduleTimerMessage.setProcessInstanceId(processInstanceId);
+        scheduleTimerMessage.setTimerId(timerId);
         scheduleTimerMessage.setPeriod(period);
-        scheduleTimerMessage.setProcessInstanceId(1L);
         schedulerProducer.send(schedulerTranslator.writeMessage(scheduleTimerMessage));
     }
 



More information about the jboss-svn-commits mailing list