activiti流程啟動的幾種方式


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);
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM