在activiti的startEvent中,我们可以通过initiator属性来设置一个变量,然后启动流程时会将authenticatedUserId(流程启动者)的值设置为activiti:initiator设置的字符串为key的流程变量上,下面看下这部分核心代码:

SubmitStartFormCmd的excute方法:

protected ProcessInstance execute(CommandContext commandContext, ProcessDefinitionEntity processDefinition) {
    ExecutionEntity processInstance = null;
    if (businessKey != null) {
      processInstance = processDefinition.createProcessInstance(businessKey);
    } else {
      processInstance = processDefinition.createProcessInstance();
    }

commandContext.getHistoryManager()
      .reportFormPropertiesSubmitted(processInstance, properties, null);
    
    StartFormHandler startFormHandler = processDefinition.getStartFormHandler();
    startFormHandler.submitFormProperties(properties, processInstance);

processInstance.start();
    
    return processInstance;
  }

接下来就是揭开面纱的时候,进入createProcessInstance方法:

public ExecutionEntity createProcessInstance(String businessKey, ActivityImpl initial) {
    ExecutionEntity processInstance = null;
  
    if(initial == null) {
      processInstance = (ExecutionEntity) super.createProcessInstance();
    }else {
      processInstance = (ExecutionEntity) super.createProcessInstanceForInitial(initial);
    }

processInstance.setExecutions(new ArrayList<ExecutionEntity>());
    processInstance.setProcessDefinition(processDefinition);
    // Do not initialize variable map (let it happen lazily)

// Set business key (if any)
    if (businessKey != null) {
    processInstance.setBusinessKey(businessKey);
    }
    
    // Inherit tenant id (if any)
    if (getTenantId() != null) {
    processInstance.setTenantId(getTenantId());
    }
    
    // Reset the process instance in order to have the db-generated process instance id available
    processInstance.setProcessInstance(processInstance);
    
    // initialize the template-defined data objects as variables first
    Map<String, Object> dataObjectVars = getVariables();
    if (dataObjectVars != null) {
      processInstance.setVariables(dataObjectVars);
    }
    
    String authenticatedUserId = Authentication.getAuthenticatedUserId();
    String initiatorVariableName = (String) getProperty(BpmnParse.PROPERTYNAME_INITIATOR_VARIABLE_NAME);
    if (initiatorVariableName!=null) {
      processInstance.setVariable(initiatorVariableName, authenticatedUserId);
    }
    if (authenticatedUserId != null) {
      processInstance.addIdentityLink(authenticatedUserId, null, IdentityLinkType.STARTER);
    }
    
    Context.getCommandContext().getHistoryManager()
      .recordProcessInstanceStart(processInstance);
    
    if (Context.getProcessEngineConfiguration().getEventDispatcher().isEnabled()) {
        Context.getProcessEngineConfiguration().getEventDispatcher().dispatchEvent(
                ActivitiEventBuilder.createEntityEvent(ActivitiEventType.ENTITY_CREATED, processInstance));
    }
    
    return processInstance;
  }

BpmnParse.PROPERTYNAME_INITIATOR_VARIABLE_NAME的值为initiatorVariableName,在StartEvent启动时会通过activiti:initiator设置的字符串来设置key为initiatorVariableName的Map,然后启动流程时就会使用该Map。

如果关于这个问题还有疑问欢迎留言~

activiti:initiator详解相关推荐

  1. activiti使用详解

    文章目录 activiti使用详解 快速开始 在项目中添加如下依赖项 修改application.yml配置文件和启动类 在resources目录下新建processes目录并添加如下流程文件task ...

  2. springboot activiti 配置项详解

    asyncExecutorEnabled属性设置设置true后将代替那些老的Job executor spring.activiti.async-executor-enabled=false spri ...

  3. activiti使用详解(一)

    简单的api程序示例(maven工程): 下载链接: http://pan.baidu.com/s/1pJ1TfgZ https://github.com/frederikheremans/activ ...

  4. 工作流引擎 Activiti 入门详解

    点击关注公众号,利用碎片时间学习 1. 什么是工作流 1.1 工作流介绍 工作流(Workflow),就是通过计算机对业务流程自动化执行管理.它主要解决的是"使在多个参与者之间按照某种预定义 ...

  5. 详解工作流框架Activiti的服务架构和组件

    摘要:通过这篇文章,可以对工作流有一个基本的认识,为后续工作流框架Activiti的学习打下坚实的基础. 本文分享自华为云社区<BPMN工作流的基本概念!详解工作流框架Activiti的服务架构 ...

  6. Activiti工作流学习之流程图应用详解

    Activiti工作流学习之流程图应用详解 1.目的 了解Activiti工作流是怎样应用流程图的. 2.环境准备 2.1.相关软件及版本 jdk版本:Jdk1.7及以上 IDE:eclipse 数据 ...

  7. bpmn如何查看代码 idea_IDEA教程之Activiti插件图文详解

    本文作者:Spring_ZYL 文章来源:https://blog.csdn.net/gozhuyinglong 版权声明:本文版权归作者所有,转载请注明出处 一.安装Activiti插件 1.搜索插 ...

  8. 基于easyui开发Web版Activiti流程定制器详解(二)——文件列表

     上一篇我们介绍了目录结构,这篇给大家整理一个文件列表以及详细说明,方便大家查找文件. 由于设计器文件主要保存在wf/designer和js/designer目录下,所以主要针对这两个目录进行详细 ...

  9. 详解BLE 空中包格式—兼BLE Link layer协议解析

    BLE有几种空中包格式?常见的PDU命令有哪些?PDU和MTU的区别是什么?DLE又是什么?BLE怎么实现重传的?BLE ACK机制原理是什么?希望这篇文章能帮你回答以上问题. 虽然BLE空中包(pa ...

最新文章

  1. 计算机论文北大核心,北大计算机(毕业论文).doc
  2. An error happened during template parsing (template: class path resource [templates/emp/list.html]
  3. 区块链技术指南笔记(二):区块链技术
  4. lua php 触摸精灵,lua程序设计主要学习路径
  5. pytorch图像和张量的相互转换_Day107:Pytorch张量类型的构建与相互转换
  6. 小米球ngrok内网穿透
  7. RabbbitMq 消费端自定义监听
  8. 关于struts2 中result type=stream
  9. 世纪华通与华为签署合作协议,加快推进绿色数据中心建设
  10. MySQL中事务的分类
  11. 熵权法求权重的Matlab实现
  12. web前端面试之基础面试题(一)(含答案)
  13. nutch2.3.1 mysql_Nutch-NewsClassify
  14. lumaqq receiver
  15. 贝塞尔曲线运动n阶追踪方程的数学原理及其匀速化方法和应用
  16. u大侠制作linux启动盘,苹果电脑利用快捷键进入U盘启动的方法
  17. Spring Boot入门教程(三十九):微信支付集成-申请服务号和微信支付
  18. HashMap初始容量指定规则
  19. Compose系列 五 副作用 side-effect
  20. 【蓝凌系统】OA首页最新知识_正文表格模板

热门文章

  1. 五大领域总目标指南_幼儿园五大领域活动总目标
  2. Word无法打开该文件,因为文件格式与扩展名不匹配
  3. 家居装修选购:挑选家用沙发的8个禁忌
  4. Android kotlin使用id直接做view的引用
  5. Perl中use strict
  6. layui 横向表单_fwr-layui-formdesigner
  7. Exif图片方向的一些发现
  8. CTF之PHP基础学习篇(一)
  9. 万兴剪刀手去水印教程_万兴神剪手怎么去水印 去除logo水印方法
  10. ecu根据什么信号对点火提前角_刷ECU能让发动机秒变高功?工程师:你还太年轻...