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.
public void execute(DelegateExecution delegateExecution) throws Exception { TaskEntity task = (TaskEntity) taskService.newTask(); task.setName(name); task.setPriority(priority); task.setProcessInstanceId(processInstanceId); task.setProcessDefinitionId(processDefinitionId); … taskService.saveTask(task); for(String group: groups){ addCandidateGroup(task.getId(), group); } }
So even if you first call a taskService.save() and afterwards the addCandidate(), both those changes will be committed together in the same transaction.
public class DummyUserExposureServiceTask implements JavaDelegate {<br><br> @Override<br> public void execute(DelegateExecution delegateExecution) throws Exception {<br> <br> delegateExecution.setVariable("moreUsers", false);<br> <br> String[] userIdsToExposeInCurrentCycle = new String[]{"group1"};<br><br> assignToUsers(Arrays.asList(userIdsToExposeInCurrentCycle), delegateExecution.getProcessInstanceId(),delegateExecution.getProcessDefinitionId(), delegateExecution.getEngineServices().getTaskService());<br><br> }<br><br> <br> private void assignToUsers(List<String> userIds, String processInstanceId, String processDefinitionId, TaskService taskService){<br> for (String each : userIds){<br> TaskEntity task = (TaskEntity) taskService.newTask();<br> task.setName("DynamicUserTask - " + each);<br> task.setPriority(100);<br> task.setProcessInstanceId(processInstanceId);<br> task.setProcessDefinitionId(processDefinitionId); <br> <br> System.out.println("About to save task " + task);<br> taskService.saveTask(task);<br> System.out.println("Done saving task " + task);<br> try {<br> taskService.addCandidateGroup(task.getId(), each);<br> System.out.println("Done adding candidate groups for task " + task);<br> } catch (Exception e) {<br> // TODO Auto-generated catch block<br> e.printStackTrace();<br> }<br> <br> }<br> }<br> <br>}
<br>@Test<br> public void testCreateTaskInServiceTask() throws Exception{<br> <br> runtimeService.startProcessInstanceByKey("CreateTasksProcess");<br> Task task = taskService.createTaskQuery().processDefinitionKey("CreateTasksProcess").singleResult();<br> taskService.addCandidateGroup(task.getId(), "user1");<br> List<Task> tasks = taskService.createTaskQuery().taskCandidateGroup("group1").list();<br><br> assertNotNull(tasks);<br><br> assertEquals(1,tasks.size());<br> }
About to save task Task[null]Done saving task Task[111]Done adding candidate groups for task Task[111]Feb 08, 2013 4:31:43 PM org.activiti.engine.impl.interceptor.CommandContext closeSEVERE: Error while closing command contextorg.activiti.engine.ActivitiException: Cannot find task with id 111 at org.activiti.engine.impl.cmd.NeedsActiveTaskCmd.execute(NeedsActiveTaskCmd.java:51) at org.activiti.engine.impl.interceptor.CommandExecutorImpl.execute(CommandExecutorImpl.java:24) at org.activiti.engine.impl.interceptor.CommandContextInterceptor.execute(CommandContextInterceptor.java:60) at org.activiti.spring.SpringTransactionInterceptor$1.doInTransaction(SpringTransactionInterceptor.java:42) at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:130) at org.activiti.spring.SpringTransactionInterceptor.execute(SpringTransactionInterceptor.java:40) at org.activiti.engine.impl.interceptor.LogInterceptor.execute(LogInterceptor.java:32) at org.activiti.engine.impl.TaskServiceImpl.addCandidateGroup(TaskServiceImpl.java:120) at simple.activiti.tasks.DummyUserExposureServiceTask.assignToUsers(DummyUserExposureServiceTask.java:37) at simple.activiti.tasks.DummyUserExposureServiceTask.execute(DummyUserExposureServiceTask.java:20) at org.activiti.engine.impl.delegate.JavaDelegateInvocation.invoke(JavaDelegateInvocation.java:34) at org.activiti.engine.impl.delegate.DelegateInvocation.proceed(DelegateInvocation.java:37) at org.activiti.engine.impl.delegate.DefaultDelegateInterceptor.handleInvocation(DefaultDelegateInterceptor.java:25) at org.activiti.engine.impl.bpmn.behavior.ServiceTaskDelegateExpressionActivityBehavior.execute(ServiceTaskDelegateExpressionActivityBehavior.java:74) at org.activiti.engine.impl.pvm.runtime.AtomicOperationActivityExecute.execute(AtomicOperationActivityExecute.java:44) at org.activiti.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:85) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:535) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:530) at org.activiti.engine.impl.pvm.runtime.AtomicOperationTransitionNotifyListenerStart.eventNotificationsCompleted(AtomicOperationTransitionNotifyListenerStart.java:52) at org.activiti.engine.impl.pvm.runtime.AbstractEventAtomicOperation.execute(AbstractEventAtomicOperation.java:56) at org.activiti.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:85) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:535) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:530) at org.activiti.engine.impl.pvm.runtime.AbstractEventAtomicOperation.execute(AbstractEventAtomicOperation.java:49) at org.activiti.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:85) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:535) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:530) at org.activiti.engine.impl.pvm.runtime.AtomicOperationTransitionCreateScope.execute(AtomicOperationTransitionCreateScope.java:49) at org.activiti.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:85) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:535) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:530) at org.activiti.engine.impl.pvm.runtime.AtomicOperationTransitionNotifyListenerTake.execute(AtomicOperationTransitionNotifyListenerTake.java:65) at org.activiti.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:85) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:535) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:530) at org.activiti.engine.impl.pvm.runtime.AtomicOperationTransitionDestroyScope.execute(AtomicOperationTransitionDestroyScope.java:115) at org.activiti.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:85) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:535) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:530) at org.activiti.engine.impl.pvm.runtime.AtomicOperationTransitionNotifyListenerEnd.eventNotificationsCompleted(AtomicOperationTransitionNotifyListenerEnd.java:36) at org.activiti.engine.impl.pvm.runtime.AbstractEventAtomicOperation.execute(AbstractEventAtomicOperation.java:56) at org.activiti.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:85) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:535) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:530) at org.activiti.engine.impl.pvm.runtime.AbstractEventAtomicOperation.execute(AbstractEventAtomicOperation.java:49) at org.activiti.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:85) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:535) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:530) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.take(ExecutionEntity.java:370) at org.activiti.engine.impl.bpmn.behavior.ExclusiveGatewayActivityBehavior.leave(ExclusiveGatewayActivityBehavior.java:74) at org.activiti.engine.impl.bpmn.behavior.FlowNodeActivityBehavior.execute(FlowNodeActivityBehavior.java:36) at org.activiti.engine.impl.pvm.runtime.AtomicOperationActivityExecute.execute(AtomicOperationActivityExecute.java:44) at org.activiti.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:85) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:535) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:530) at org.activiti.engine.impl.pvm.runtime.AtomicOperationTransitionNotifyListenerStart.eventNotificationsCompleted(AtomicOperationTransitionNotifyListenerStart.java:52) at org.activiti.engine.impl.pvm.runtime.AbstractEventAtomicOperation.execute(AbstractEventAtomicOperation.java:56) at org.activiti.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:85) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:535) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:530) at org.activiti.engine.impl.pvm.runtime.AbstractEventAtomicOperation.execute(AbstractEventAtomicOperation.java:49) at org.activiti.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:85) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:535) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:530) at org.activiti.engine.impl.pvm.runtime.AtomicOperationTransitionCreateScope.execute(AtomicOperationTransitionCreateScope.java:49) at org.activiti.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:85) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:535) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:530) at org.activiti.engine.impl.pvm.runtime.AtomicOperationTransitionNotifyListenerTake.execute(AtomicOperationTransitionNotifyListenerTake.java:65) at org.activiti.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:85) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:535) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:530) at org.activiti.engine.impl.pvm.runtime.AtomicOperationTransitionDestroyScope.execute(AtomicOperationTransitionDestroyScope.java:115) at org.activiti.engine.impl.interceptor.CommandContext.performOperation(CommandContext.java:85) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperationSync(ExecutionEntity.java:535) at org.activiti.engine.impl.persistence.entity.ExecutionEntity.performOperation(ExecutionEntity.java:530)
<?xml version="1.0" encoding="UTF-8"?><br><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>" xmlns:xsi="<a href="http://www.w3.org/2001/XMLSchema-instance" rel="nofollow noopener noreferrer">http://www.w3.org/2001/XMLSchema-instance</a>" xmlns:activiti="<a href="http://activiti.org/bpmn" rel="nofollow noopener noreferrer">http://activiti.org/bpmn</a>" xmlns:bpmndi="<a href="http://www.omg.org/spec/BPMN/20100524/DI" rel="nofollow noopener noreferrer">http://www.omg.org/spec/BPMN/20100524/DI</a>" xmlns:smileysurprised:mgdc="<a href="http://www.omg.org/spec/DD/20100524/DC" rel="nofollow noopener noreferrer">http://www.omg.org/spec/DD/20100524/DC</a>" xmlns:smileysurprised:mgdi="<a href="http://www.omg.org/spec/DD/20100524/DI" rel="nofollow noopener noreferrer">http://www.omg.org/spec/DD/20100524/DI</a>" typeLanguage="<a href="http://www.w3.org/2001/XMLSchema" rel="nofollow noopener noreferrer">http://www.w3.org/2001/XMLSchema</a>" expressionLanguage="<a href="http://www.w3.org/1999/XPath" rel="nofollow noopener noreferrer">http://www.w3.org/1999/XPath</a>" targetNamespace="<a href="http://www.activiti.org/test" rel="nofollow noopener noreferrer">http://www.activiti.org/test</a>"><br> <process id="CreateTasksProcess" name="CreateTasksProcess"><br> <endEvent id="endevent1" name="End"></endEvent><br> <serviceTask id="servicetask2" name="Send offer to users (create tasks)" default="flow46" activiti:delegateExpression="${userExposureServiceTask}"></serviceTask><br> <startEvent id="startevent1" name="Start"></startEvent><br> <exclusiveGateway id="exclusivegateway1" name="Exclusive Gateway"></exclusiveGateway><br> <exclusiveGateway id="exclusivegateway2" name="Exclusive Gateway"></exclusiveGateway><br> <sequenceFlow id="flow21" name="${moreUsers}" sourceRef="exclusivegateway1" targetRef="exclusivegateway2"><br> <conditionExpression xsi:type="tFormalExpression"><![CDATA[${moreUsers}]]></conditionExpression><br> </sequenceFlow><br> <sequenceFlow id="flow22" name="" sourceRef="exclusivegateway2" targetRef="servicetask2"></sequenceFlow><br> <sequenceFlow id="flow46" name="" sourceRef="servicetask2" targetRef="exclusivegateway1"></sequenceFlow><br> <sequenceFlow id="flow47" name="" sourceRef="exclusivegateway1" targetRef="usertask1"></sequenceFlow><br> <sequenceFlow id="flow48" name="" sourceRef="startevent1" targetRef="exclusivegateway2"></sequenceFlow><br> <sequenceFlow id="flow49" name="" sourceRef="exclusivegateway2" targetRef="endevent1"><br> <conditionExpression xsi:type="tFormalExpression"><![CDATA[false]]></conditionExpression><br> </sequenceFlow><br> <userTask id="usertask1" name="Dummy User Task to keep process running"></userTask><br> <sequenceFlow id="flow50" name="" sourceRef="usertask1" targetRef="endevent1"></sequenceFlow><br> </process><br> <bpmndi:BPMNDiagram id="BPMNDiagram_CreateTasksProcess"><br> <bpmndi:BPMNPlane bpmnElement="CreateTasksProcess" id="BPMNPlane_CreateTasksProcess"><br> <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1"><br> <omgdc:Bounds height="35" width="35" x="980" y="163"></omgdc:Bounds><br> </bpmndi:BPMNShape><br> <bpmndi:BPMNShape bpmnElement="servicetask2" id="BPMNShape_servicetask2"><br> <omgdc:Bounds height="55" width="105" x="520" y="152"></omgdc:Bounds><br> </bpmndi:BPMNShape><br> <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1"><br> <omgdc:Bounds height="35" width="35" x="277" y="162"></omgdc:Bounds><br> </bpmndi:BPMNShape><br> <bpmndi:BPMNShape bpmnElement="exclusivegateway1" id="BPMNShape_exclusivegateway1"><br> <omgdc:Bounds height="40" width="40" x="763" y="160"></omgdc:Bounds><br> </bpmndi:BPMNShape><br> <bpmndi:BPMNShape bpmnElement="exclusivegateway2" id="BPMNShape_exclusivegateway2"><br> <omgdc:Bounds height="40" width="40" x="420" y="160"></omgdc:Bounds><br> </bpmndi:BPMNShape><br> <bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1"><br> <omgdc:Bounds height="68" width="114" x="830" y="147"></omgdc:Bounds><br> </bpmndi:BPMNShape><br> <bpmndi:BPMNEdge bpmnElement="flow21" id="BPMNEdge_flow21"><br> <omgdi:waypoint x="783" y="160"></omgdi:waypoint><br> <omgdi:waypoint x="782" y="65"></omgdi:waypoint><br> <omgdi:waypoint x="439" y="65"></omgdi:waypoint><br> <omgdi:waypoint x="440" y="160"></omgdi:waypoint><br> <bpmndi:BPMNLabel><br> <omgdc:Bounds height="13" width="100" x="10" y="0"></omgdc:Bounds><br> </bpmndi:BPMNLabel><br> </bpmndi:BPMNEdge><br> <bpmndi:BPMNEdge bpmnElement="flow22" id="BPMNEdge_flow22"><br> <omgdi:waypoint x="460" y="180"></omgdi:waypoint><br> <omgdi:waypoint x="520" y="179"></omgdi:waypoint><br> </bpmndi:BPMNEdge><br> <bpmndi:BPMNEdge bpmnElement="flow46" id="BPMNEdge_flow46"><br> <omgdi:waypoint x="625" y="179"></omgdi:waypoint><br> <omgdi:waypoint x="763" y="180"></omgdi:waypoint><br> </bpmndi:BPMNEdge><br> <bpmndi:BPMNEdge bpmnElement="flow47" id="BPMNEdge_flow47"><br> <omgdi:waypoint x="803" y="180"></omgdi:waypoint><br> <omgdi:waypoint x="830" y="181"></omgdi:waypoint><br> </bpmndi:BPMNEdge><br> <bpmndi:BPMNEdge bpmnElement="flow48" id="BPMNEdge_flow48"><br> <omgdi:waypoint x="312" y="179"></omgdi:waypoint><br> <omgdi:waypoint x="420" y="180"></omgdi:waypoint><br> </bpmndi:BPMNEdge><br> <bpmndi:BPMNEdge bpmnElement="flow49" id="BPMNEdge_flow49"><br> <omgdi:waypoint x="440" y="200"></omgdi:waypoint><br> <omgdi:waypoint x="440" y="325"></omgdi:waypoint><br> <omgdi:waypoint x="725" y="325"></omgdi:waypoint><br> <omgdi:waypoint x="997" y="325"></omgdi:waypoint><br> <omgdi:waypoint x="997" y="198"></omgdi:waypoint><br> </bpmndi:BPMNEdge><br> <bpmndi:BPMNEdge bpmnElement="flow50" id="BPMNEdge_flow50"><br> <omgdi:waypoint x="944" y="181"></omgdi:waypoint><br> <omgdi:waypoint x="980" y="180"></omgdi:waypoint><br> </bpmndi:BPMNEdge><br> </bpmndi:BPMNPlane><br> </bpmndi:BPMNDiagram><br></definitions>
<br>public class TaskServiceImpl extends ServiceImpl implements TaskService {<br>…<br>public void addCandidateGroup(String taskId, String groupId) {<br> commandExecutor.execute(new AddIdentityLinkCmd(taskId, null, groupId, IdentityLinkType.CANDIDATE));<br> }<br>…<br>}<br><br>public class AddIdentityLinkCmd extends NeedsActiveTaskCmd<Void>