https://zhangxingr.github.io/2018/09/06/activiti%E6%B5%81%E7%A8%8B%E5%90%AF%E5%8A%A8%E7%9A%84%E5%87%A0%E7%A7%8D%E6%96%B9%E5%BC%8F/#more
前言
最近在斷斷續續的學習activiti工作流引擎,為了增強自己對activiti的理解,特此將學習內容整理在博文上,方便自己回憶。
流程啟動方式
activiti的流程啟動總結來說有四種啟動方式,分別是根據key啟動、根據processDefinitionId啟動、根據message啟動,通過ProcessInstanceBuilder啟動。
根據processDefinitionKey啟動
根據processDefinitionKey啟動也就是根據流程定義文件的key啟動,是activiti最常用的啟動方式。
示例
流程定義文件,key為my-process
<process id="my-process"> <startEvent id="start" /> <sequenceFlow id="flow1" sourceRef="start" targetRef="someTask" /> <userTask id="someTask" name="Activiti is awesome!" /> <sequenceFlow id="flow2" sourceRef="someTask" targetRef="end" /> <endEvent id="end" /> </process>
java代碼:
@Test @org.activiti.engine.test.Deployment(resources = "my-process.bpmn20.xml") public void testStartProcessInstanceByKey() { RuntimeService runtimeService = activitiRule.getRuntimeService(); Map<String, Object> map = Maps.newHashMap(); map.put("name", "zhangxingr"); map.put("sex", "man"); map.put("age", "21"); ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("my-process", map); logger.info("processInstance = {}", processInstance); }
根據processDefinitionId啟動
示例
Java代碼
@Test @org.activiti.engine.test.Deployment(resources = "my-process.bpmn20.xml") public void testStartProcessInstanceById() { RuntimeService runtimeService = activitiRule.getRuntimeService(); Map<String, Object> map = Maps.newHashMap(); map.put("name", "zhangxingr"); map.put("sex", "man"); map.put("age", "21"); ProcessDefinition processDefinition = activitiRule.getRepositoryService() .createProcessDefinitionQuery().singleResult(); ProcessInstance processInstance = runtimeService .startProcessInstanceById(processDefinition.getId(), map); logger.info("processInstance = {}, process'key = {}, process'name = {}", processInstance, processInstance.getProcessDefinitionKey(), processInstance.getName()); }
根據message啟動
根據message啟動就要復雜一些,需要改動一下流程定義文件的startEvent,增加messageEventDefinition。
示例
流程定義文件
<message id="messageStart" name="my-message"/> <process id="my-process"> <startEvent id="start"> <messageEventDefinition messageRef="messageStart"/> </startEvent> <sequenceFlow id="flow1" sourceRef="start" targetRef="someTask" /> <userTask id="someTask" name="Activiti is awesome!" /> <sequenceFlow id="flow2" sourceRef="someTask" targetRef="end" /> <endEvent id="end" /> </process>
Java代碼
@Test @org.activiti.engine.test.Deployment(resources = "my-process-message.bpmn20.xml") public void testMessageStart() { RuntimeService runtimeService = activitiRule.getRuntimeService(); ProcessInstance processInstance = runtimeService .startProcessInstanceByMessage("my-message"); logger.info("processInstance = {}", processInstance); }
根據message啟動最終其實還是會走到用processDefinitionId來啟動。。。
源碼解析
public ProcessInstance execute(CommandContext commandContext) { if (messageName == null) { throw new ActivitiIllegalArgumentException("Cannot start process instance by message: message name is null"); } MessageEventSubscriptionEntity messageEventSubscription = commandContext.getEventSubscriptionEntityManager().findMessageStartEventSubscriptionByName(messageName, tenantId); if (messageEventSubscription == null) { throw new ActivitiObjectNotFoundException("Cannot start process instance by message: no subscription to message with name '" + messageName + "' found.", MessageEventSubscriptionEntity.class); } String processDefinitionId = messageEventSubscription.getConfiguration(); if (processDefinitionId == null) { throw new ActivitiException("Cannot start process instance by message: subscription to message with name '" + messageName + "' is not a message start event."); } DeploymentManager deploymentCache = commandContext.getProcessEngineConfiguration().getDeploymentManager(); ProcessDefinition processDefinition = deploymentCache.findDeployedProcessDefinitionById(processDefinitionId); if (processDefinition == null) { throw new ActivitiObjectNotFoundException("No process definition found for id '" + processDefinitionId + "'", ProcessDefinition.class); } ProcessInstanceHelper processInstanceHelper = commandContext.getProcessEngineConfiguration().getProcessInstanceHelper(); ProcessInstance processInstance = processInstanceHelper.createAndStartProcessInstanceByMessage(processDefinition, messageName, processVariables, transientVariables); return processInstance; }
從上面可以看到,最終還是生成了一個processDefinitionId然后調createAndStartProcessInstanceByMessage來啟動,具體可以去跟下源碼。
根據processInstanceBuilder啟動
Java代碼
@Test @org.activiti.engine.test.Deployment(resources = "my-process.bpmn20.xml") public void testProcessInstanceBuilder() { RuntimeService runtimeService = activitiRule.getRuntimeService(); Map<String, Object> map = Maps.newHashMap(); map.put("name", "zhangxingr"); map.put("sex", "man"); map.put("age", "21"); ProcessInstanceBuilder builder = runtimeService.createProcessInstanceBuilder(); ProcessInstance processInstance = builder.processDefinitionKey("my-process") .businessKey("businessKey001") .name("我的流程實例") .start(); logger.info("processInstance = {}", processInstance); }