• Activity工作流开发简单介绍


    1. 工作流表

    在这里插入图片描述
    由图中可以看到,依赖中已经集成了mybatis框架,在第一次初始化流程引擎(ProcessEngine)时,会自动创建24张表(图示版本)。

    act_evt_log, 
    act_ge_bytearray, 
    act_ge_property, 
    act_hi_actinst, 
    act_hi_attachment, 
    act_hi_comment, 
    act_hi_detail, 
    act_hi_identitylink, 
    act_hi_procinst,
    act_hi_taskinst, 
    act_hi_varinst, 
    act_id_group, 
    act_id_info, 
    act_id_membership, 
    act_id_user,
    act_re_deployment, 
    act_re_model, 
    act_re_procdef, 
    act_ru_event_subscr, 
    act_ru_execution, 
    act_ru_identitylink, 
    act_ru_job, 
    act_ru_task, 
    act_ru_variable
    
    1. act_re_*: 're’表示repository。 这个前缀的表包含了流程定义和流程静态资源 (图片,规则,等等)。
    2. act_ru_*: 'ru’表示runtime。 这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据。 activiti只在流程实例执行过程中保存这些数据, 在流程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快。
    3. act_id_*: 'id’表示identity。 这些表包含身份信息,比如用户,组等等。
    4. act_hi_*: 'hi’表示history。 这些表包含历史数据,比如历史流程实例, 变量,任务等等。
    5. act_ge_*: 通用数据, 用于不同场景下。
      参考:Activity工作流入门

    重点介绍下一下几张表

    1. act_ge_bytearray:保存的工作流.bpmn以及对应的图片.png二进制文件
    2. act_re_deployment:保存部署
    3. act_re_procdef:保存部署的流程
    4. act_ru_execution:保存等待执行的操作,包含启动、结束事件、任务、gateway流动等
    5. act_ru_task:保存等待执行的任务
    6. act_ru_variable:保存任务执行时定义的量
    7. act_hi_actinst:保存所有执行(已执行和未执行)的操作,包含启动、结束事件、任务、gateway流动等
    8. act_hi_procinst:保存部署的流程的历史
    9. act_hi_taskinst:保存已经执行的任务

    2. 实战

    2.1 流程定义

    定义一个网站开发的工作模式,开发工作准备好之后就同时让web端、server端、mobile端同时开发,所有的都完成后才算结束。(使用eclipse或者idea插件完成制图工作)
    流程如图:
    在这里插入图片描述
    流程代码:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" xmlns:tns="http://www.activiti.org/test" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" expressionLanguage="http://www.w3.org/1999/XPath" id="m1600330675002" name="" targetNamespace="http://www.activiti.org/test" typeLanguage="http://www.w3.org/2001/XMLSchema">
      <process id="devWebsite" isClosed="false" isExecutable="true" name="开发网站" processType="None">
        <startEvent id="startevent1" name="start"/>
        <userTask activiti:exclusive="true" id="startDev" name="开发"/>
        <parallelGateway gatewayDirection="Unspecified" id="mutipathDevParallelGateway" name="多线路共同开发"/>
        <userTask activiti:exclusive="true" id="webDev" name="web端"/>
        <userTask activiti:exclusive="true" id="serverDev" name="server端"/>
        <userTask activiti:exclusive="true" id="mobileDev" name="mobile端"/>
        <endEvent id="endevent1" name="end"/>
        <sequenceFlow id="_8" sourceRef="startevent1" targetRef="startDev"/>
        <sequenceFlow id="_9" sourceRef="startDev" targetRef="mutipathDevParallelGateway"/>
        <sequenceFlow id="_10" sourceRef="mutipathDevParallelGateway" targetRef="webDev"/>
        <sequenceFlow id="_11" sourceRef="mutipathDevParallelGateway" targetRef="serverDev"/>
        <sequenceFlow id="_2" sourceRef="mutipathDevParallelGateway" targetRef="mobileDev"/>
        <sequenceFlow id="_3" sourceRef="webDev" targetRef="endevent1"/>
        <sequenceFlow id="_4" sourceRef="serverDev" targetRef="endevent1"/>
        <sequenceFlow id="_5" sourceRef="mobileDev" targetRef="endevent1"/>
      </process>
      <bpmndi:BPMNDiagram documentation="background=#FFFFFF;count=1;horizontalcount=1;orientation=0;width=842.4;height=1195.2;imageableWidth=832.4;imageableHeight=1185.2;imageableX=5.0;imageableY=5.0" id="Diagram-_1" name="New Diagram">
        <bpmndi:BPMNPlane bpmnElement="devWebsite">
          <bpmndi:BPMNShape bpmnElement="startevent1" id="Shape-startevent1">
            <omgdc:Bounds height="32.0" width="32.0" x="325.0" y="30.0"/>
            <bpmndi:BPMNLabel>
              <omgdc:Bounds height="32.0" width="32.0" x="0.0" y="0.0"/>
            </bpmndi:BPMNLabel>
          </bpmndi:BPMNShape>
          <bpmndi:BPMNShape bpmnElement="startDev" id="Shape-startDev">
            <omgdc:Bounds height="55.0" width="85.0" x="305.0" y="135.0"/>
            <bpmndi:BPMNLabel>
              <omgdc:Bounds height="55.0" width="85.0" x="0.0" y="0.0"/>
            </bpmndi:BPMNLabel>
          </bpmndi:BPMNShape>
          <bpmndi:BPMNShape bpmnElement="mutipathDevParallelGateway" id="Shape-mutipathDevParallelGateway">
            <omgdc:Bounds height="32.0" width="32.0" x="330.0" y="225.0"/>
            <bpmndi:BPMNLabel>
              <omgdc:Bounds height="32.0" width="32.0" x="0.0" y="0.0"/>
            </bpmndi:BPMNLabel>
          </bpmndi:BPMNShape>
          <bpmndi:BPMNShape bpmnElement="webDev" id="Shape-webDev">
            <omgdc:Bounds height="55.0" width="85.0" x="190.0" y="345.0"/>
            <bpmndi:BPMNLabel>
              <omgdc:Bounds height="55.0" width="85.0" x="0.0" y="0.0"/>
            </bpmndi:BPMNLabel>
          </bpmndi:BPMNShape>
          <bpmndi:BPMNShape bpmnElement="serverDev" id="Shape-serverDev">
            <omgdc:Bounds height="55.0" width="85.0" x="315.0" y="345.0"/>
            <bpmndi:BPMNLabel>
              <omgdc:Bounds height="55.0" width="85.0" x="0.0" y="0.0"/>
            </bpmndi:BPMNLabel>
          </bpmndi:BPMNShape>
          <bpmndi:BPMNShape bpmnElement="mobileDev" id="Shape-mobileDev">
            <omgdc:Bounds height="55.0" width="85.0" x="430.0" y="345.0"/>
            <bpmndi:BPMNLabel>
              <omgdc:Bounds height="55.0" width="85.0" x="0.0" y="0.0"/>
            </bpmndi:BPMNLabel>
          </bpmndi:BPMNShape>
          <bpmndi:BPMNShape bpmnElement="endevent1" id="Shape-endevent1">
            <omgdc:Bounds height="32.0" width="32.0" x="340.0" y="465.0"/>
            <bpmndi:BPMNLabel>
              <omgdc:Bounds height="32.0" width="32.0" x="0.0" y="0.0"/>
            </bpmndi:BPMNLabel>
          </bpmndi:BPMNShape>
          <bpmndi:BPMNEdge bpmnElement="_2" id="BPMNEdge__2" sourceElement="mutipathDevParallelGateway" targetElement="mobileDev">
            <omgdi:waypoint x="362.0" y="241.0"/>
            <omgdi:waypoint x="470.0" y="315.0"/>
            <omgdi:waypoint x="470.0" y="345.0"/>
            <bpmndi:BPMNLabel>
              <omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/>
            </bpmndi:BPMNLabel>
          </bpmndi:BPMNEdge>
          <bpmndi:BPMNEdge bpmnElement="_3" id="BPMNEdge__3" sourceElement="webDev" targetElement="endevent1">
            <omgdi:waypoint x="230.0" y="400.0"/>
            <omgdi:waypoint x="230.0" y="440.0"/>
            <omgdi:waypoint x="340.0" y="481.0"/>
            <bpmndi:BPMNLabel>
              <omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/>
            </bpmndi:BPMNLabel>
          </bpmndi:BPMNEdge>
          <bpmndi:BPMNEdge bpmnElement="_4" id="BPMNEdge__4" sourceElement="serverDev" targetElement="endevent1">
            <omgdi:waypoint x="356.0" y="400.0"/>
            <omgdi:waypoint x="356.0" y="465.0"/>
            <bpmndi:BPMNLabel>
              <omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/>
            </bpmndi:BPMNLabel>
          </bpmndi:BPMNEdge>
          <bpmndi:BPMNEdge bpmnElement="_5" id="BPMNEdge__5" sourceElement="mobileDev" targetElement="endevent1">
            <omgdi:waypoint x="475.0" y="400.0"/>
            <omgdi:waypoint x="475.0" y="425.0"/>
            <omgdi:waypoint x="372.0" y="481.0"/>
            <bpmndi:BPMNLabel>
              <omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/>
            </bpmndi:BPMNLabel>
          </bpmndi:BPMNEdge>
          <bpmndi:BPMNEdge bpmnElement="_8" id="BPMNEdge__8" sourceElement="startevent1" targetElement="startDev">
            <omgdi:waypoint x="341.0" y="62.0"/>
            <omgdi:waypoint x="341.0" y="135.0"/>
            <bpmndi:BPMNLabel>
              <omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/>
            </bpmndi:BPMNLabel>
          </bpmndi:BPMNEdge>
          <bpmndi:BPMNEdge bpmnElement="_9" id="BPMNEdge__9" sourceElement="startDev" targetElement="mutipathDevParallelGateway">
            <omgdi:waypoint x="346.0" y="190.0"/>
            <omgdi:waypoint x="346.0" y="225.0"/>
            <bpmndi:BPMNLabel>
              <omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/>
            </bpmndi:BPMNLabel>
          </bpmndi:BPMNEdge>
          <bpmndi:BPMNEdge bpmnElement="_11" id="BPMNEdge__11" sourceElement="mutipathDevParallelGateway" targetElement="serverDev">
            <omgdi:waypoint x="346.0" y="257.0"/>
            <omgdi:waypoint x="346.0" y="345.0"/>
            <bpmndi:BPMNLabel>
              <omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/>
            </bpmndi:BPMNLabel>
          </bpmndi:BPMNEdge>
          <bpmndi:BPMNEdge bpmnElement="_10" id="BPMNEdge__10" sourceElement="mutipathDevParallelGateway" targetElement="webDev">
            <omgdi:waypoint x="330.0" y="241.0"/>
            <omgdi:waypoint x="230.0" y="310.0"/>
            <omgdi:waypoint x="230.0" y="345.0"/>
            <bpmndi:BPMNLabel>
              <omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/>
            </bpmndi:BPMNLabel>
          </bpmndi:BPMNEdge>
        </bpmndi:BPMNPlane>
      </bpmndi:BPMNDiagram>
    </definitions>
    

    2.2 代码演示

    1. 创建流程引擎

    private ProcessEngine getProcessEngine() {
        ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration();
        Properties properties = new Properties();
        try {
            properties = Resource.getClasspathProperties("activity.properties");
            log.info("====================开始打印工作流配置=====================");
            properties.forEach((key, value) -> System.out.println(key + "=" + value));
        } catch (IOException e) {
            e.printStackTrace();
        }
        configuration.setJdbcDriver(Resource.getProperty(properties, "activity.datasource.driver"));
        configuration.setJdbcUrl(Resource.getProperty(properties, "activity.datasource.url"));
        configuration.setJdbcUsername(Resource.getProperty(properties, "activity.datasource.username"));
        configuration.setJdbcPassword(Resource.getProperty(properties, "activity.datasource.password"));
        configuration.setDatabaseSchemaUpdate(Resource.getProperty(properties, "activity.databaseSchemaUpdate"));
        return configuration.buildProcessEngine();
    }
    

    2. 部署流程

    @Test
    public void deployProcess() {
        DeploymentBuilder deploymentBuilder = getProcessEngine().getRepositoryService().createDeployment();
        deploymentBuilder.addClasspathResource("DevelopWebsite.bpmn");
        Deployment deploy = deploymentBuilder.deploy();
        System.out.println(StringUtil.format("============= 部署的流程ID为:{}=============", deploy.getId()));
    }
    

    3. 根据流程部署ID查询流程定义ID

    @Test
    public void queryProcessDefinition() {
        String deployId = "1";
        ProcessDefinitionQuery query = getProcessEngine().getRepositoryService().createProcessDefinitionQuery();
        query.deploymentId(deployId);
        query.list().forEach(item -> System.out.println(StringUtil.format("============ 流程定义ID为:{} ============", item.getId())));
    }
    

    4. 根据流程定义ID启动流程

    /**
     * @description: 根据流程定义ID启动流程,涉及到两张表:
     * 1. act_ru_execution-记录未执行的进程记录,包含任务、gateway的执行,就像是指令。
     * 2. act_ru_task:记录未执行的任务
     * @author: yulin.chen
     * @date: 2020/9/17 17:19
     */
    @Test
    public void startProcessByProcessDefinitionId() {
        String processDefinitionId = "devWebsite:1:4";
        ProcessInstance instance = getProcessEngine().getRuntimeService().startProcessInstanceById(processDefinitionId);
        System.out.println(StringUtil.format("============ 启动的实例ID为:{} ============", instance.getId()));
    }
    

    5. 根据流程实例ID查询当前执行中的任务

    @Test
    public void queryRuntimeTasksByProcessInstanceId() {
        String processInstanceId = "2501";
        TaskQuery query = getProcessEngine().getTaskService().createTaskQuery();
        //根据流程实例id查询
        query.processInstanceId(processInstanceId);
        //任务执行时间排序
        query.orderByTaskCreateTime().desc();
        query.list().forEach(item -> System.out.println(StringUtil.format("============ 正在执行的任务ID为:{},任务名:{} ============",
                item.getId(), item.getName())));
    
    }
    

    6. 根据任务ID完成任务

    @Test
    public void execuTask() {
        String taskId = "2504";
        getProcessEngine().getTaskService().complete(taskId);
    }
    
    只有把命运掌握在自己手中,从今天起开始努力,即使暂时看不到希望,也要相信自己。因为比你牛几倍的人,依然在努力。
  • 相关阅读:
    [置顶] Django 微信开发(一)——环境搭建
    opencv学习_5 (IplImage的结构)
    HDU 3910 (13.10.31)
    Python源码学习七 .py文件的解释
    Android高效加载大图、多图解决方案,有效避免程序内存溢出现象
    记录cocos2d-html5与cocosd-x jsb中遇到的坑
    【PAT Advanced Level】1011. World Cup Betting (20)
    Linux文件实时同步,可实现一对多
    mahout源码分析之DistributedLanczosSolver(五)Job over
    php引入lucene方法
  • 原文地址:https://www.cnblogs.com/freesky168/p/14358159.html
Copyright © 2020-2023  润新知