[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