赵宇博的技术博客 赵宇博的技术博客
首页
前端
后端
数据库专栏
k8s专栏
分布式专栏
Linux网络专栏
手写系列专栏
随笔
关于
GitHub (opens new window)
首页
前端
后端
数据库专栏
k8s专栏
分布式专栏
Linux网络专栏
手写系列专栏
随笔
关于
GitHub (opens new window)
  • JVM专题

  • 源码专题

  • Activi6专题

    • Activiti6-28张表关系梳理
    • SpringBoot集成Activiti和UI
    • Activiti6-API详解
      • Activiti6-业务实现
    • 杂谈

    • 后端
    • Activi6专题
    zhaoyb
    2024-11-28
    目录

    Activiti6-API详解

    # Activiti6-API详解

    Activiti核心API主要包括8个:

    • RepositoryService:提供流程部署和流程定义的操作方法,如流程定义的挂起、激活等
    • RuntimeService:提供运行时流程实例的操作方法,如流程实例的发起、流程变量的设置等
    • TaskService:提供运行时流程任务的操作方法,如任务的创建、办理、指派、认领和删除等
    • HistoryService:提供历史流程数据的操作方法,如历史流程实例、历史变量、历史任务的查询等
    • ManagementService:提供对工作流引擎进行管理和维护的方法,如数据库表数据、表元数据的查询和执行命令
    • IdentityService:提供用户或者组的操作方法,如用户的增、删、改、查等
    • FormService:提供流程表单的操作方法,如表单获取、表单保存等
    • DynamicBpmnService:提供流程定义的动态修改方法,从而避免重新部署它。

    接下来通过流程实例,一个一个的调用这些API,并观察调用之后数据表的变化

    # 1、RepositoryService(存储服务)

    存储服务主要提供4类操作:

    • 流程部署的创建、删除、查询
    • 流程定义的查询、挂起、激活
    • 模型的新建、保存、删除
    • 候选人、候选组的新增、删除、查询

    # 1.1、流程模型保存

    在UI界面调整模型后,点击保存,触发API

    image-20241128192758587

    // 1、先调用newModel()创建新的模型对象
    Model model = repositoryService.newModel();
    // 2、给模型数据增加参数
    model.setCategory(modelRequest.getCategory());
    model.setKey(modelRequest.getKey());
    ObjectNode modelNode = objectMapper.createObjectNode();
    modelNode.put(ModelDataJsonConstants.MODEL_NAME, modelRequest.getName());
    modelNode.put(ModelDataJsonConstants.MODEL_DESCRIPTION, modelRequest.getDescription());
    modelNode.put(ModelDataJsonConstants.MODEL_REVISION, modelRequest.getVersion());
    model.setMetaInfo(modelNode.toString());
    model.setName(modelRequest.getName());
    model.setVersion(modelRequest.getVersion());
    // 3、调用saveModel保存模型
    repositoryService.saveModel(model);
    // 4、调用addModelEditorSource保存模型文件
    repositoryService.addModelEditorSource(model.getId(), objectMapper.writeValueAsBytes(content));
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16

    保存过后,涉及到的表 act_re_model、act_ge_bytearray

    # 1.2、流程部署

    流程只有部署之后才能使用

    // 1、通过模型ID进行部署,先查询模型信息
    Model model = repositoryService.getModel(modelId);
    byte[] modelData = repositoryService.getModelEditorSource(modelId);
    //2、调用部署流程API createDeployment
    BpmnModel bpmnModel = (new BpmnJsonConverter()).convertToBpmnModel(jsonNode);
    Deployment deploy = repositoryService.createDeployment().category(model.getCategory())
        .name(model.getName()).key(model.getKey())
        .addBpmnModel(model.getKey() + ".bpmn20.xml", bpmnModel)
        .deploy();
    // 3、把部署ID同步写回模型表
    model.setDeploymentId(deploy.getId());
    repositoryService.saveModel(model);
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12

    部署过后,涉及到的表 act_re_deployment,act_re_procdef

    image-20241128194042063

    # 1.3、流程挂起

    repositoryService.suspendProcessDefinitionById("");
    
    1

    涉及的表act_re_procdef,其中字段SUSPENSION_STATE_(流程挂起状态)会修改为true

    # 1.4、流程激活

    流程激活可以取消挂起,可以通过ID或者key来激活流程

    // 通过流程ID激活
    repositoryService.activateProcessDefinitionById("");
    
    1
    2

    流程激活之后,会涉及到act_re_procdef

    # 2、RuntimeService(运行时服务)

    运行时服务主要提供6类操作:

    • 创建和发起流程实例
    • 唤醒等待状态的流程实例
    • 流程权限的管理,主要是流程实例和人员之间的关系管理
    • 流程变量的管理,变量的新增、删除、查询
    • 管理运行时流程实例、执行实例
    • 信号、消息事件的发布与接收,以及事件监听器的管理

    # 2.1、流程发起

    // 多种发起流程实例的API,大致分为ID、KEY、消息等直接发起流程
    // 通过流程KEY启动
    runtimeService.startProcessInstanceByKey("leave", String.valueOf(leaveapply.getId()), variables);
    
    1
    2
    3

    启动之后,涉及多张表的数据流转:

    act_ru_execution:运行时流程执行实例表,会增加两个数据,为主子数据

    image-20241128195305586

    act_ru_identitylink:存储运行时的参数数据

    其中,第一条流程实例ID 2506,代表这个流程实例是admin账户启动的。第二条数据,候选人是部门经理组织,说明下一个任务的执行人是属于部门经理组织下的人员

    image-20241128201515176

    act_ru_task:任务表,代表下一个执行的任务,是直系领导审批节点

    image-20241128201743379

    act_ru_variable:运行时参数,刚才启动流程加入了申请人和部门领导两个参数,所以这个表有两个数据

    image-20241128201952111

    流程发起源码解读:

    Activiti启动时做的操作:

    1、缓存解析器

    BpmnXMLConverter首次加载会先缓存各种类型的解析器,比如任务解析器、网关解析器等

    image-20241204155230633

    2、初始化整个责任链 ProcessEngineConfigurationImpl

    在项目启动时,ProcessEngineConfigurationImpl中的init()方法调用initCommandExecutor(),调用initInterceptorChain,会把所有的拦截器放入Chain中,然后抛出收节点first = chain.get(0), 最后new CommandExecutorImpl(getDefaultCommandConfig(), first),这样first就有了初始值,后续CommandExecutorImpl执行first.execute的时候就会按照调用链依次执行拦截器逻辑

    image-20241204201305499

    image-20241204201326572

    3、业务源码解析时序图如下图所示:

    Activiti代码时序图

    # 2.2、流程审批

    查询我的代办:

    // 根据当前人信息查询任务表中办理人是自己的数据,就是我的代办
     TaskQuery condition = taskService.createTaskQuery().taskAssignee(username);
     // 过滤掉流程挂起的待办任务 .active()
    int total = condition.active().orderByTaskCreateTime().desc().list().size();
    int start = (param.getPageNum()-1) * param.getPageSize();
    // 分页查询
    List<Task> taskList = condition.active().orderByTaskCreateTime().desc().listPage(start, param.getPageSize());
    
    1
    2
    3
    4
    5
    6
    7

    办理流程:

    // 将某个任务指定给某个人
    taskService.setAssignee(taskId, username);
    // 直接办理
    taskService.complete(taskId);
    // 或者根据参数进行办理
    taskService.complete(taskId, variables);
    
    1
    2
    3
    4
    5
    6

    办理之后涉及的表:

    act_ru_task:任务表,代表下一个执行的任务,是部门领导审批节点

    act_hi_comment:历史命令表,代表已经执行过的审核命令

    act_hi_actinst:三条数据,代表已经执行的两个,和未执行的一个

    image-20241128204413524

    act_hi_taskinst:历史任务实例表,当前表会插入两个数据,和actinst相比,没有开始节点的数据,这个表也是经常使用查询流程追踪历史的表

    # 2.3、流程办理,走网关流程详解

    1、跟开始节点的执行逻辑差不多,核心就是CommandInvoker一直循环执行里面的命令,执行完一个命令之后,判断下一个节点类型,压入对应的执行器,而具体的业务实现都是在xxxBehavior中

    Activiti代码时序图

    # 3、HistoryService(历史服务)

    历史服务主要提供4类操作:

    • 创建历史流程实例、历史活动实例、历史任务实例、历史详情、历史变量等对象的查询;
    • 创建历史流程实例、历史活动实例、历史任务实例、历史详情、历史变量等对象的原生查询,支持传入SQL;
    • 删除历史流程实例、历史任务实例
    • 查询与历史流程实例、任务实例关联的用户

    1、查询历史任务节点的API

    historyService.createHistoricActivityInstanceQuery().processInstanceId(processInstanceId)
        .activityType("userTask").orderByHistoricActivityInstanceStartTime().asc().list();
    /*
    list方法最终的查询时执行mybatis的查询逻辑,固定查询selectHistoricTaskInstancesByQueryCriteria方法
    mybatis对应的xml文件目录在:activiti-engine-6.0.0.jar!\org\activiti\db\mapping\entity\HistoricTaskInstance.xml
    */
    
    1
    2
    3
    4
    5
    6

    Activiti代码时序图

    # 4、ManagementService(管理服务)

    管理服务主要提供数据表和元数据的管理和查询服务

    还提供查询和管理异步任务的功能(比如定时器、异步操作、延迟暂停、激活)

    还可以直接执行某个CMD命令

    # 4.1、查询所有数据表的数据条数

        @Test
        public void testManagement() {
            Map<String, Long> tableCount = managementService.getTableCount();
            for (Map.Entry<String, Long> stringLongEntry : tableCount.entrySet()) {
                System.out.println(stringLongEntry.getKey() + " : " + stringLongEntry.getValue());
            }
        }
    
    1
    2
    3
    4
    5
    6
    7

    # 5、IdentityService(身份服务)

    身份服务接口负责提供用户、组、和人员组织关系管理等

    主要提供3类方法:

    • 用户管理相关:新建用户、保存用户、查询、删除用户等
    • 与组管理相关:增删改查 用户组
    • 维护用户和用户组的关系
    @Test
    public void testUser() {
        User u1 = identityService.newUser("zhaoyubo");
        u1.setFirstName("zhao");
        u1.setLastName("yubo");
        u1.setEmail("zhaoyubo@163.com");
        identityService.saveUser(u1);
    
        Group leaderGroup = identityService.newGroup("leaderGroup");
        leaderGroup.setName("领导组");
        leaderGroup.setType("LEADER");
        identityService.saveGroup(leaderGroup);
    
        identityService.createMembership("zhaoyubo", "leaderGroup");
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15

    # 6、监听的执行顺序

    执行监听器:可以在流程结束后发短信给某人

    流程和节点有start和end事件2种事件。顺序流有start、end、take3种事件

    start end take

    任务监听器: 可以在流程流转到某个节点且需要某个用户处理时通知该用户 create 任务创建事件 assignment 任务指派事件 complete 任务完成事件 delete 任务删除事件

    把所有事件都配置一遍,然后执行流程,观察监听的执行顺序

    StartListener
    AssignmentListener
    CreateListener
    CompleteListener
    DeleteListener
    EndListener
    
    StartListener
    TakeListener
    EndListener
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

    全局事件监听器

    #Activiti
    上次更新: 2024/12/04, 21:07:47
    SpringBoot集成Activiti和UI
    Activiti6-业务实现

    ← SpringBoot集成Activiti和UI Activiti6-业务实现→

    最近更新
    01
    Activiti6-业务实现
    12-06
    02
    SpringBoot集成Activiti和UI
    11-21
    03
    Activiti6-28张表关系梳理
    11-21
    更多文章>
    Theme by Vdoing | Copyright © 2022-2024 赵宇博 | MIT License
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式