As we transition to the new Hyland Community, some post links may be temporarily disrupted as we finalize redirects. We apologize for the inconvenience and are working to resolve this as quickly as possible. Details.
<process id="ccaProcess" name="ccaProcess"> <startEvent id="startevent1" name="Start"></startEvent> <serviceTask id="servicetask1" name="Build-1" activiti:class="com.mycomp.step.cca.bpm.CcaDelegate"></serviceTask> <serviceTask id="servicetask2" name="Build-2" activiti:class="com.mycomp.step.cca.bpm.CcaDelegate"></serviceTask> <parallelGateway id="parallelgateway2" name="Parallel Gateway"></parallelGateway> <endEvent id="endevent1" name="End"></endEvent> <sequenceFlow id="flow4" name="" sourceRef="servicetask1" targetRef="parallelgateway2"></sequenceFlow> <sequenceFlow id="flow5" name="" sourceRef="servicetask2" targetRef="parallelgateway2"></sequenceFlow> <sequenceFlow id="flow6" name="" sourceRef="parallelgateway2" targetRef="endevent1"></sequenceFlow> <parallelGateway id="parallelgateway3" name="Parallel Gateway"></parallelGateway> <sequenceFlow id="flow8" name="" sourceRef="parallelgateway3" targetRef="servicetask1"></sequenceFlow> <sequenceFlow id="flow9" name="" sourceRef="parallelgateway3" targetRef="servicetask2"></sequenceFlow> <sequenceFlow id="flow10" name="" sourceRef="startevent1" targetRef="parallelgateway3"></sequenceFlow> </process>
runtimeService.startProcessInstanceByKey("ccaProcess");
<definitions xmlns="<a href="http://www.omg.org/spec/BPMN/20100524/MODEL" rel="nofollow noopener noreferrer">http://www.omg.org/spec/BPMN/20100524/MODEL</a>"<br> xmlns:activiti="<a href="http://activiti.org/bpmn" rel="nofollow noopener noreferrer">http://activiti.org/bpmn</a>" targetNamespace="Examples"><br> <process id="cca-workflow-process" name="cca-workflow-process"><br> <documentation>Place documentation for the 'mtrose-bpm-workflow'<br> process here.</documentation><br> <startEvent id="startevent1" name="Start"></startEvent><br> <parallelGateway id="parallelgateway1" name="Parallel Gateway"></parallelGateway><br> <serviceTask id="build" name="build"<br> activiti:class="com.cisco.step.cca.engine.delegate.BuildTaskDelegate" activiti:async="true"></serviceTask><br> <parallelGateway id="parallelgateway2" name="Parallel Gateway"></parallelGateway><br> <serviceTask id="hss_sanity_c4" name="hss_sanity_c4"<br> activiti:class="com.cisco.step.cca.engine.delegate.SanityTaskDelegate"></serviceTask><br> <serviceTask id="sa" name="sa"<br> activiti:class="com.cisco.step.cca.engine.delegate.StaticAnalysisTaskDelegate"></serviceTask><br> <serviceTask id="cr" name="cr"<br> activiti:class="com.cisco.step.cca.engine.delegate.CodeReviewTaskDelegate" activiti:async="true"></serviceTask><br> <serviceTask id="ut" name="ut"<br> activiti:class="com.cisco.step.cca.engine.delegate.UnitTestTaskDelegate" activiti:async="true"></serviceTask><br> <sequenceFlow id="flow1" name="" sourceRef="startevent1"<br> targetRef="parallelgateway1"></sequenceFlow><br> <parallelGateway id="parallelgateway3" name="Parallel Gateway"></parallelGateway><br> <endEvent id="endevent1" name="End"></endEvent><br> <sequenceFlow id="flow5" name="" sourceRef="build"<br> targetRef="parallelgateway2"></sequenceFlow><br> <sequenceFlow id="flow6" name="" sourceRef="parallelgateway2"<br> targetRef="hss_sanity_c4"></sequenceFlow><br> <sequenceFlow id="flow7" name="" sourceRef="parallelgateway2"<br> targetRef="sa"></sequenceFlow><br> <parallelGateway id="parallelgateway4" name="Parallel Gateway"></parallelGateway><br> <sequenceFlow id="flow10" name="" sourceRef="parallelgateway3"<br> targetRef="parallelgateway4"></sequenceFlow><br> <sequenceFlow id="flow11" name="" sourceRef="cr"<br> targetRef="parallelgateway4"></sequenceFlow><br> <sequenceFlow id="flow12" name="" sourceRef="ut"<br> targetRef="parallelgateway4"></sequenceFlow><br> <sequenceFlow id="flow13" name="" sourceRef="parallelgateway4"<br> targetRef="endevent1"></sequenceFlow><br> <sequenceFlow id="flow14" name="" sourceRef="parallelgateway1"<br> targetRef="build"></sequenceFlow><br> <sequenceFlow id="flow15" name="" sourceRef="parallelgateway1"<br> targetRef="cr"></sequenceFlow><br> <sequenceFlow id="flow16" name="" sourceRef="parallelgateway1"<br> targetRef="ut"></sequenceFlow><br> <receiveTask id="sanity_response" name="sanity_response" activiti:class="com.cisco.step.cca.engine.delegate.SanityStatusTaskDelegate"></receiveTask><br> <sequenceFlow id="flow17" name="" sourceRef="hss_sanity_c4"<br> targetRef="sanity_response"></sequenceFlow><br> <sequenceFlow id="flow18" name="" sourceRef="sanity_response"<br> targetRef="parallelgateway3"></sequenceFlow><br> <sequenceFlow id="flow19" name="" sourceRef="sa"<br> targetRef="parallelgateway3"></sequenceFlow><br> </process><br></definitions>
public class BuildTaskDelegate implements JavaDelegate {<br> <br> public void execute(DelegateExecution execution) throws Exception {<br> System.out.println("before…");<br> Process process=Runtime.getRuntime().exec("sleep 10");<br> System.out.println("after…");<br> }<br>}<br>
<br>This background thread is the activiti job executor (actually a thread pool) which periodically polls the database for jobs. So behind the scenes, when we reach the "generate invoice" task, we are creating a job "message" for activiti to continue the process later and persisting it into the database. This job is then picked up by the job executor and executed. We are also giving the local job executor a little hint that there is a new job, to improve performance.<br>
public class YourCompanyService {<br><br><br> private Set<String> processLocks = new HashSet<…>;<br>…<br><br>public boolean printTheCard(String cardIdentifier) {<br> // Correlate between card-id and task/process to use<br> String processId = runtimeService.createtaskQuery()……singleResult();<br><br> // JVM-wide lock for this specific use-case.<br> boolean isSafe = false;<br> synchronized(this) {<br> isSafe = processLocks.contains(processId);<br> if(isSafe) {<br> processLocks.add(processId);<br> }<br> }<br><br> if(!isSafe) {<br> throw new MyCompanyException("looks like you're too late…");<br> }<br><br> // important, release the lock in "finally"<br> try {<br> // Finish task<br> taskService……<br> ….<br> } <br> finally<br> {<br> synchronized(this) {<br> processLocks.remove(processId);<br> }<br><br> }<br>}<br><br>}