[jbpm-commits] JBoss JBPM SVN: r4128 - in jbpm3/branches/jbpm-3.2.6.GA/modules/core/src: main/java/org/jbpm/graph/exe and 5 other directories.

do-not-reply at jboss.org do-not-reply at jboss.org
Tue Mar 3 19:46:18 EST 2009


Author: alex.guizar at jboss.com
Date: 2009-03-03 19:46:18 -0500 (Tue, 03 Mar 2009)
New Revision: 4128

Modified:
   jbpm3/branches/jbpm-3.2.6.GA/modules/core/src/main/java/org/jbpm/db/JobSession.java
   jbpm3/branches/jbpm-3.2.6.GA/modules/core/src/main/java/org/jbpm/graph/exe/ProcessInstance.java
   jbpm3/branches/jbpm-3.2.6.GA/modules/core/src/main/java/org/jbpm/job/CleanUpProcessJob.java
   jbpm3/branches/jbpm-3.2.6.GA/modules/core/src/main/resources/org/jbpm/db/hibernate.queries.hbm.xml
   jbpm3/branches/jbpm-3.2.6.GA/modules/core/src/test/java/org/jbpm/jbpm1798/JBPM1798Test.java
   jbpm3/branches/jbpm-3.2.6.GA/modules/core/src/test/java/org/jbpm/msg/command/AsyncExecutionDbTest.java
   jbpm3/branches/jbpm-3.2.6.GA/modules/core/src/test/java/org/jbpm/perf/SimplePerformanceTest.java
Log:
JBPM-2043: merge r4126 from branch jbpm-3.2.5.SP

Modified: jbpm3/branches/jbpm-3.2.6.GA/modules/core/src/main/java/org/jbpm/db/JobSession.java
===================================================================
--- jbpm3/branches/jbpm-3.2.6.GA/modules/core/src/main/java/org/jbpm/db/JobSession.java	2009-03-03 23:20:30 UTC (rev 4127)
+++ jbpm3/branches/jbpm-3.2.6.GA/modules/core/src/main/java/org/jbpm/db/JobSession.java	2009-03-04 00:46:18 UTC (rev 4128)
@@ -217,20 +217,21 @@
     }
   }
 
+  public int countDeletableJobsForProcessInstance(ProcessInstance processInstance) {
+    Number jobCount = (Number) session.getNamedQuery("JobSession.countDeletableJobsForProcessInstance")
+        .setParameter("processInstance", processInstance)
+        .uniqueResult();
+    return jobCount.intValue();
+  }
+
   public void deleteJobsForProcessInstance(ProcessInstance processInstance) {
     try {
-      // delete node execution jobs
-      int entityCount = session.getNamedQuery("JobSession.deleteExecuteNodeJobsForProcessInstance")
+      // delete unowned node-execute-jobs and timers
+      int entityCount = session.getNamedQuery("JobSession.deleteJobsForProcessInstance")
           .setParameter("processInstance", processInstance)
           .executeUpdate();
-      log.debug("deleted " + entityCount + " execute-node-jobs for " + processInstance);
+      log.debug("deleted " + entityCount + " jobs for " + processInstance);
 
-      // delete unowned timers
-      entityCount = session.getNamedQuery("JobSession.deleteTimersForProcessInstance")
-          .setParameter("processInstance", processInstance)
-          .executeUpdate();
-      log.debug("deleted " + entityCount + " timers for " + processInstance);
-
       // prevent further repetitions
       List<?> timers = session.getNamedQuery("JobSession.findRepeatingTimersForProcessInstance")
           .setParameter("processInstance", processInstance)

Modified: jbpm3/branches/jbpm-3.2.6.GA/modules/core/src/main/java/org/jbpm/graph/exe/ProcessInstance.java
===================================================================
--- jbpm3/branches/jbpm-3.2.6.GA/modules/core/src/main/java/org/jbpm/graph/exe/ProcessInstance.java	2009-03-03 23:20:30 UTC (rev 4127)
+++ jbpm3/branches/jbpm-3.2.6.GA/modules/core/src/main/java/org/jbpm/graph/exe/ProcessInstance.java	2009-03-04 00:46:18 UTC (rev 4128)
@@ -29,8 +29,10 @@
 import java.util.List;
 import java.util.Map;
 
+import org.jbpm.JbpmContext;
 import org.jbpm.JbpmException;
 import org.jbpm.context.exe.ContextInstance;
+import org.jbpm.db.JobSession;
 import org.jbpm.graph.def.Event;
 import org.jbpm.graph.def.Identifiable;
 import org.jbpm.graph.def.Node;
@@ -44,6 +46,7 @@
 import org.jbpm.module.def.ModuleDefinition;
 import org.jbpm.module.exe.ModuleInstance;
 import org.jbpm.msg.MessageService;
+import org.jbpm.persistence.PersistenceService;
 import org.jbpm.svc.Services;
 import org.jbpm.taskmgmt.exe.TaskMgmtInstance;
 import org.jbpm.util.Clock;
@@ -359,15 +362,22 @@
         superProcessToken.signal(superExecutionContext);
       }
 
-      // make sure all the timers for this process instance are canceled after the process end updates are posted to the
-      // database
-      // NOTE Only timers should be deleted, messages should be kept.
-      MessageService messageService = (MessageService)Services.getCurrentService(Services.SERVICENAME_MESSAGE, false);
-      if (messageService != null)
+      // make sure jobs for this process instance are canceled 
+      // after the process end updates are posted to the database
+      JbpmContext jbpmContext = JbpmContext.getCurrentJbpmContext();
+      if (jbpmContext != null)
       {
-        CleanUpProcessJob job = new CleanUpProcessJob(this);
-        job.setDueDate(new Date());
-        messageService.send(job);
+        Services services = jbpmContext.getServices();
+        MessageService messageService = services.getMessageService();
+        PersistenceService persistenceService = services.getPersistenceService();
+        if (messageService != null
+            && persistenceService != null
+            && persistenceService.getJobSession().countDeletableJobsForProcessInstance(this) > 0)
+        {
+          CleanUpProcessJob job = new CleanUpProcessJob(rootToken);
+          job.setDueDate(new Date());
+          messageService.send(job);
+        }
       }
     }
   }

Modified: jbpm3/branches/jbpm-3.2.6.GA/modules/core/src/main/java/org/jbpm/job/CleanUpProcessJob.java
===================================================================
--- jbpm3/branches/jbpm-3.2.6.GA/modules/core/src/main/java/org/jbpm/job/CleanUpProcessJob.java	2009-03-03 23:20:30 UTC (rev 4127)
+++ jbpm3/branches/jbpm-3.2.6.GA/modules/core/src/main/java/org/jbpm/job/CleanUpProcessJob.java	2009-03-04 00:46:18 UTC (rev 4128)
@@ -22,7 +22,7 @@
 package org.jbpm.job;
 
 import org.jbpm.JbpmContext;
-import org.jbpm.graph.exe.ProcessInstance;
+import org.jbpm.graph.exe.Token;
 import org.jbpm.scheduler.SchedulerService;
 
 /**
@@ -36,8 +36,8 @@
     // default constructor
   }
 
-  public CleanUpProcessJob(ProcessInstance processInstance) {
-    this.processInstance = processInstance;
+  public CleanUpProcessJob(Token token) {
+    super(token);
   }
 
   public boolean execute(JbpmContext jbpmContext) throws Exception {

Modified: jbpm3/branches/jbpm-3.2.6.GA/modules/core/src/main/resources/org/jbpm/db/hibernate.queries.hbm.xml
===================================================================
--- jbpm3/branches/jbpm-3.2.6.GA/modules/core/src/main/resources/org/jbpm/db/hibernate.queries.hbm.xml	2009-03-03 23:20:30 UTC (rev 4127)
+++ jbpm3/branches/jbpm-3.2.6.GA/modules/core/src/main/resources/org/jbpm/db/hibernate.queries.hbm.xml	2009-03-04 00:46:18 UTC (rev 4128)
@@ -345,14 +345,25 @@
     ]]>
   </query>
 
-  <query name="JobSession.deleteTimersForProcessInstance">
+  <query name="JobSession.countDeletableJobsForProcessInstance">
     <![CDATA[
-      delete from org.jbpm.job.Timer timer
-      where timer.processInstance = :processInstance
-        and timer.lockOwner is null
+      select count(job.id)
+      from org.jbpm.job.Job job
+      where job.processInstance = :processInstance
+        and job.lockOwner is null
+        and job.class in (org.jbpm.job.ExecuteNodeJob, org.jbpm.job.Timer)
     ]]>
   </query>
 
+  <query name="JobSession.deleteJobsForProcessInstance">
+    <![CDATA[
+      delete from org.jbpm.job.Job job
+      where job.processInstance = :processInstance
+        and job.lockOwner is null
+        and job.class in (org.jbpm.job.ExecuteNodeJob, org.jbpm.job.Timer)
+    ]]>
+  </query>
+
   <query name="JobSession.findRepeatingTimersForProcessInstance">
     <![CDATA[
       select timer
@@ -362,14 +373,6 @@
     ]]>
   </query>
 
-  <query name="JobSession.deleteExecuteNodeJobsForProcessInstance">
-    <![CDATA[
-      delete from org.jbpm.job.ExecuteNodeJob job
-      where job.processInstance = :processInstance
-        and job.lockOwner is null
-    ]]>
-  </query>
-
   <query name="JobSession.findJobsByToken">
     <![CDATA[
       select job

Modified: jbpm3/branches/jbpm-3.2.6.GA/modules/core/src/test/java/org/jbpm/jbpm1798/JBPM1798Test.java
===================================================================
--- jbpm3/branches/jbpm-3.2.6.GA/modules/core/src/test/java/org/jbpm/jbpm1798/JBPM1798Test.java	2009-03-03 23:20:30 UTC (rev 4127)
+++ jbpm3/branches/jbpm-3.2.6.GA/modules/core/src/test/java/org/jbpm/jbpm1798/JBPM1798Test.java	2009-03-04 00:46:18 UTC (rev 4128)
@@ -34,7 +34,7 @@
     try {
       pd.createProcessInstance();
       newTransaction();
-      assertEquals(2, getNbrOfJobsAvailable());
+      assertEquals(1, getNbrOfJobsAvailable());
       processJobs(maxWaitTime);
     }
     finally {

Modified: jbpm3/branches/jbpm-3.2.6.GA/modules/core/src/test/java/org/jbpm/msg/command/AsyncExecutionDbTest.java
===================================================================
--- jbpm3/branches/jbpm-3.2.6.GA/modules/core/src/test/java/org/jbpm/msg/command/AsyncExecutionDbTest.java	2009-03-03 23:20:30 UTC (rev 4127)
+++ jbpm3/branches/jbpm-3.2.6.GA/modules/core/src/test/java/org/jbpm/msg/command/AsyncExecutionDbTest.java	2009-03-04 00:46:18 UTC (rev 4128)
@@ -162,7 +162,7 @@
       processInstance.signal();
       jbpmContext.save(processInstance);
       assertEquals(processDefinition.getNode("end"), processInstance.getRootToken().getNode());
-      assertEquals(7, getNbrOfJobsAvailable());
+      assertEquals(6, getNbrOfJobsAvailable());
       assertEquals(0, recordedActionNumbers.size());
 
       processJobs(5000);

Modified: jbpm3/branches/jbpm-3.2.6.GA/modules/core/src/test/java/org/jbpm/perf/SimplePerformanceTest.java
===================================================================
--- jbpm3/branches/jbpm-3.2.6.GA/modules/core/src/test/java/org/jbpm/perf/SimplePerformanceTest.java	2009-03-03 23:20:30 UTC (rev 4127)
+++ jbpm3/branches/jbpm-3.2.6.GA/modules/core/src/test/java/org/jbpm/perf/SimplePerformanceTest.java	2009-03-04 00:46:18 UTC (rev 4128)
@@ -21,10 +21,8 @@
  */
 package org.jbpm.perf;
 
-// $Id$
+import java.util.concurrent.Semaphore;
 
-import java.text.NumberFormat;
-
 import org.jbpm.db.AbstractDbTestCase;
 import org.jbpm.graph.def.ActionHandler;
 import org.jbpm.graph.def.ProcessDefinition;
@@ -32,72 +30,93 @@
 import org.jbpm.graph.exe.ProcessInstance;
 
 /**
- * This tests creates a number of process instances. 
- * Every instance has a call to an ActionHandler. 
+ * This tests creates a number of process instances. Every instance has a call to an ActionHandler.
+ * https://jira.jboss.org/jira/browse/JBPM-2043
  * 
- * https://jira.jboss.org/jira/browse/JBPM-2043
- *
  * @author mvecera at redhat.com
  * @author pmacik at redhat.com
  * @author thomas.diesler at jboss.com
  * @author alex.guizar at jboss.com
  * @since 18-Feb-2009
  */
-public class SimplePerformanceTest extends AbstractDbTestCase
-{
-  private static final int INSTANCES = 1000;
-  private static int count;
-  
-  ProcessDefinition processDefinition;
+public class SimplePerformanceTest extends AbstractDbTestCase {
 
-  public void setUp() throws Exception
-  {
+  private static final int WARMUP_INSTANCES = 100;
+  private static final int MEASUREMENT_INSTANCES = 1000;
+
+  private static final Semaphore signalLight = new Semaphore(0);
+
+  private ProcessDefinition processDefinition;
+
+  @Override
+  public void setUp() throws Exception {
     super.setUp();
 
-    processDefinition = ProcessDefinition.parseXmlString(
-        "<process-definition name='perf' xmlns='urn:jbpm.org:jpdl-3.1'>" + 
-        "  <start-state name='start'>" + 
-        "    <transition name='to_state' to='end'>" + 
-        "      <action class='" + PerfActionHandler.class.getName() + "'/>" + 
-        "    </transition>" + 
-        "  </start-state>" + 
-        "  <end-state name='end'/>" + 
-        "</process-definition>");
+    processDefinition = ProcessDefinition.parseXmlString("<process-definition name='perf'>"
+        + "  <event type='process-start'>"
+        + "    <action class='"
+        + AsyncSignalAction.class.getName()
+        + "' async='true'/>"
+        + "  </event>"
+        + "  <start-state name='start'>"
+        + "    <transition to='end'/>"
+        + "  </start-state>"
+        + "  <end-state name='end'/>"
+        + "</process-definition>");
     jbpmContext.deployProcessDefinition(processDefinition);
-    newTransaction();
+
+    startJobExecutor();
   }
 
-  public void tearDown() throws Exception
-  {
+  @Override
+  public void tearDown() throws Exception {
+    stopJobExecutor();
     jbpmContext.getGraphSession().deleteProcessDefinition(processDefinition.getId());
     super.tearDown();
   }
 
-  public void testAsyncCall()
-  {
-    long start = System.currentTimeMillis();
+  public void testAsyncCall() {
+    launchProcessInstances(WARMUP_INSTANCES);
 
-    for (count = 1; count <= INSTANCES; count++)
-    {
+    long startTime = System.currentTimeMillis();
+    launchProcessInstances(MEASUREMENT_INSTANCES);
+
+    long duration = System.currentTimeMillis() - startTime;
+    System.out.println("=== Test finished processing "
+        + MEASUREMENT_INSTANCES
+        + " instances in "
+        + duration
+        + "ms ===");
+    System.out.println("=== This is "
+        + Math.round(1000f * MEASUREMENT_INSTANCES / duration)
+        + " instances per second ===");
+  }
+
+  private void launchProcessInstances(int count) {
+    for (int i = 0; i < count; i++) {
+      newTransaction();
       ProcessInstance pi = new ProcessInstance(processDefinition);
-      pi.signal();
       jbpmContext.save(pi);
-      newTransaction();
     }
 
-    long stop = System.currentTimeMillis();
-    System.out.println("=== Test finished processing " + INSTANCES + " instances in " + (stop - start) + "ms ===");
-    System.out.println("=== This is " + Math.round(1000 * INSTANCES / (stop - start)) + " instances per second ===");
+    commitAndCloseSession();
+    try {
+      signalLight.acquire(count);
+    }
+    catch (InterruptedException e) {
+      fail(getName() + " got interrupted while waiting for process instances to end");
+    }
+    finally {
+      beginSessionTransaction();
+    }
   }
 
-  public static class PerfActionHandler implements ActionHandler
-  {
-    private static final long serialVersionUID = 1L;
+  public static class AsyncSignalAction implements ActionHandler {
+    private static final long serialVersionUID = -8617329370138396271L;
 
-    public void execute(ExecutionContext executionContext) throws Exception
-    {
-      if (count % (INSTANCES / 4) == 0)
-        System.out.println(NumberFormat.getPercentInstance().format((double) count / INSTANCES));
+    public void execute(final ExecutionContext executionContext) throws Exception {
+      signalLight.release();
+      executionContext.leaveNode();
     }
   }
 }




More information about the jbpm-commits mailing list