[jbpm-commits] JBoss JBPM SVN: r6707 - jbpm3/branches/jbpm-3.2-soa/core/src/main/java/org/jbpm/graph/exe.

do-not-reply at jboss.org do-not-reply at jboss.org
Thu Sep 30 09:42:55 EDT 2010


Author: bradsdavis
Date: 2010-09-30 09:42:54 -0400 (Thu, 30 Sep 2010)
New Revision: 6707

Modified:
   jbpm3/branches/jbpm-3.2-soa/core/src/main/java/org/jbpm/graph/exe/ProcessInstance.java
Log:
Added asynchronous signaling for process instances.

This should be exclusive to the parent process instance because if these fire concurrently, it leads to potential stale object state exceptions.

Modified: jbpm3/branches/jbpm-3.2-soa/core/src/main/java/org/jbpm/graph/exe/ProcessInstance.java
===================================================================
--- jbpm3/branches/jbpm-3.2-soa/core/src/main/java/org/jbpm/graph/exe/ProcessInstance.java	2010-09-30 13:39:44 UTC (rev 6706)
+++ jbpm3/branches/jbpm-3.2-soa/core/src/main/java/org/jbpm/graph/exe/ProcessInstance.java	2010-09-30 13:42:54 UTC (rev 6707)
@@ -30,6 +30,8 @@
 import java.util.List;
 import java.util.Map;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.jbpm.JbpmContext;
 import org.jbpm.JbpmException;
 import org.jbpm.context.exe.ContextInstance;
@@ -41,6 +43,8 @@
 import org.jbpm.graph.log.ProcessInstanceCreateLog;
 import org.jbpm.graph.log.ProcessInstanceEndLog;
 import org.jbpm.job.CleanUpProcessJob;
+import org.jbpm.job.SignalSuperProcessJob;
+import org.jbpm.job.SignalTokenJob;
 import org.jbpm.logging.exe.LoggingInstance;
 import org.jbpm.logging.log.ProcessLog;
 import org.jbpm.module.def.ModuleDefinition;
@@ -57,7 +61,8 @@
  * execution of a process definition, just use the {@link #ProcessInstance(ProcessDefinition)}.
  */
 public class ProcessInstance implements Identifiable, Serializable {
-
+  
+  private static final Log log = LogFactory.getLog(ProcessInstance.class);
   private static final long serialVersionUID = 1L;
 
   long id;
@@ -340,18 +345,32 @@
     // add the process instance end log
     rootToken.addLog(new ProcessInstanceEndLog());
 
+    JbpmContext jbpmContext = JbpmContext.getCurrentJbpmContext();
     // check if this process was started as a subprocess of a super process
     if (superProcessToken != null && !superProcessToken.hasEnded()) {
-      addCascadeProcessInstance(superProcessToken.getProcessInstance());
-
-      ExecutionContext superExecutionContext = new ExecutionContext(superProcessToken);
-      superExecutionContext.setSubProcessInstance(this);
-      superProcessToken.signal(superExecutionContext);
+    	Services services = jbpmContext.getServices();
+    	if(services.getMessageService()!=null)
+    	{
+    		if(log.isDebugEnabled())
+    		{
+    			log.debug("Scheduling signal token for parent process: "+superProcessToken);
+    		}
+    		MessageService messageService = services.getMessageService();
+    		SignalTokenJob job = new SignalTokenJob(superProcessToken);
+    		job.setExclusive(true);
+    		messageService.send(job);
+    	}
+    	else
+    	{
+    		addCascadeProcessInstance(superProcessToken.getProcessInstance());
+    	    ExecutionContext superExecutionContext = new ExecutionContext(superProcessToken);
+    	    superExecutionContext.setSubProcessInstance(this);
+    	    superProcessToken.signal(superExecutionContext);
+    	}
     }
 
     // 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) {
       Services services = jbpmContext.getServices();
       PersistenceService persistenceService = services.getPersistenceService();



More information about the jbpm-commits mailing list