Activiti初体验

流程实例操作

  1. 插件安装

    idea低版本安装actiBPM亦可

  2. 安装重启后,在resource静态资源文件夹下创建processes文件夹

  3. 右击processes文件夹新建bpmn文件

  4. 显示xml文件

  5. 2xml文件右击选择创建bpmn.xml文件

  6. 创建开始事件

  7. 点击开始事件设置id和name

  8. 接下来右击创建user task 设置id,name及用户名

  9. 最后创建结束事件 设置id和name

  10. 右击保存图片,存入processes下并取名

    此时processes下会多一个png样式的图片,就是流程图

    注意xml和png格式:

    • png:xxx.png

    • xml:xxxx.bpmn20.xml

通过bpmn和png文件部署流程定义

 

 /**
     * 部署流程定义
     * 部署流程:
     * 1. act_re_procdef 生成流程定义信息表(id值组成:流程定义唯一表示key:版本号:随机标识值.)
     * 2. act_re_deployment 流程部署信息表,每执行一次部署,会插入一条记录
     * 3. act_ge_bytearray 流程资源表,插入资源数据,当前插入两条记录(.bpmn和.png资源)
     * 其中 act_re_deployment 与 act_re_procdef 表是一对多的关系,
     * act_re_procdef 每条记录对应一个流程的定义信息
     * 每次部署,针对相同的流程定义key,对应的version会自增1
     */
    @Test
    public void deplayByFile(){
        //1,获取流程引擎实例
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
​
        //2,获取部署流程定义的service
        RepositoryService repositoryService = processEngine.getRepositoryService();
​
        //3,调用相关api方法进行部署
        Deployment deployment = repositoryService.createDeployment()
                .name("请假申请流程")
                .addClasspathResource("processes/leave.bpmn20.xml")
                .addClasspathResource("processes/leave.png")
                .deploy();
        //4,部署输出结果
        System.out.println(deployment.getId());
        System.out.println(deployment.getName());
    }

此时,act_re_procdef,act_re_deployment,act_ge_bytearray三张表里面会添加相应的数据

zip 流程定义压缩包部署

将 leave.bpmn20.xml和 leave.png 压缩成 leave.zip ,放在类路径下的 processes/leave.zip

运行代码:

/**
     * 通过zip压缩包部署流程定义
     */
    @Test
    public void deplayByZip(){
        //1,获取流程引擎实例
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
​
        //2,获取部署流程定义的service
        RepositoryService repositoryService = processEngine.getRepositoryService();
​
        //3,部署流程定义
        //读取zip资源压缩包,转成输入流
        InputStream is = ReflectUtil.getResourceAsStream("processes/leave.zip");
        ZipInputStream zipInputStream = new ZipInputStream(is);
        Deployment deployment = repositoryService.createDeployment()
                .addZipInputStream(zipInputStream)
                .name("请假申请流程压缩包")
                .deploy();
        //4,部署输出结果
        System.out.println(deployment.getId());
        System.out.println(deployment.getName());
    }

运行结果

注意,此时数据库里面的key里面的值应与流程定义key对应

相同流程这边version是依次叠加的

查询部署好的流程定义数据

/**
     * 查询部署好的流程定义数据
     */
    @Test
    public void getProcessDefinitionList() {
        //1,获取流程引擎实例
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
​
        //2,获取部署流程定义的service
        RepositoryService repositoryService = processEngine.getRepositoryService();
​
        //3,获取流程定义查询对象
        ProcessDefinitionQuery query = repositoryService.createProcessDefinitionQuery();
        List<ProcessDefinition> processDefinitions = query.processDefinitionKey("leave")
                .orderByProcessDefinitionVersion()
                .desc()
                .list();
​
        for (ProcessDefinition pd : processDefinitions) {
            System.out.print("流程部署id:" + pd.getDeploymentId());
            System.out.print(", 流程定义id:" + pd.getId());
            System.out.print(", 流程定义key:" + pd.getKey());
            System.out.print(", 流程定义名称:" + pd.getName());
            System.out.println(", 流程版本号:" + pd.getVersion());
        }
    }

启动流程实例

流程定义部署后,然后可以通过 activiti 工作流管理业务流程了。例如上一篇部署好了请假流程,可以申请请假了。

针对部署好的流程定义,每次用户发起一个新的请假申请,就对应的启动一个新的请假流程实例;

类似于 java 类与 java 对象(实例)的关系,定义好类后,使用 new 创建一个对象(实例)使用,当然可以 new 多个对象(实例)。

    /**
     * 开启一个流程实例(提交申请) 开启流程需要使用以下7张表
     * act_hi_taskinst:流程实例的历史任务信息
     * act_hi_procinst:流程实例的历史表
     * act_hi_actinst:流程实例节点历史信息
     * act_hi_identitylink:流程实例的参与者历史信息
     * act_ru_execution:流程实例运行中执行的信息
     * act_ru_task:流程实例运行中的(节点)任务信息
     * act_ru_identitylink:流程实例运行中的参与者信息
     */
    @Test
    public void startProcessInstance() {
        //1,获取流程引擎实例
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
​
        //2,获取RuntimeService服务实例
        RuntimeService runtimeService = processEngine.getRuntimeService();
​
        //3,开启流程实例 (流程定义key,每次启动都会查找最新的版本)
        //通过流程定义key启动的流程实例,我们是最新版本的流程定义数据
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("leave");
​
        System.out.println("流程定义id:" + processInstance.getProcessDefinitionId());
        System.out.println("流程实例id:" + processInstance.getId());
​
    }

注释里对应的数据库表里会添加相应的记录

当前开启的流程也是最新版本的流程

查询办理人的待办任务(注释部分可查询多个待办任务,但钱只有一条任务的情况下,可返回一条),将待办任务进行完成。

/**
     * 查询办理人的待办任务
     */
    @Test
    public void taskListByAssignee() {
        //1,获取流程引擎实例
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
​
        //2,获取taskService
        TaskService taskService = processEngine.getTaskService();
​
       /* //3,查询待办任务
        List<Task> list = taskService.createTaskQuery()
                .processDefinitionKey("leave")
                .taskAssignee("wsy1")
                .list();
        for (Task task : list) {
            System.out.println("流程实例id: " + task.getProcessInstanceId());
            System.out.println("任务id: " + task.getId());
            System.out.println("(节点)任务名称: " + task.getName());
            System.out.println("任务办理人: " + task.getAssignee());
        }*/
​
        //3,当前只有一条任务,则仅返回一条
        Task task = taskService.createTaskQuery()
                .taskAssignee("wsy1")
                .singleResult();
        //4,完成任务
        if(task != null) {
            taskService.complete(task.getId());
            System.out.println("完成任务");
        } else {
            System.out.println("查询结果为空");
        }
    }

返回结果

此时,当前流程审批任务完成,进行下一审批或者审批完成

当前wsy1的任务结束,act_ru_task表里面会记录下一个任务节点

act_ru_identitylink表显示当前流程任务参与者有两个人

   更多表记录信息可在下列表中查询
   
   开启一个流程实例(提交申请) 开启流程需要使用以下7张表
   act_hi_taskinst:流程实例的历史任务信息
   act_hi_procinst:流程实例的历史表
   act_hi_actinst:流程实例节点历史信息
   act_hi_identitylink:流程实例的参与者历史信息
   act_ru_execution:流程实例运行中执行的信息
   act_ru_task:流程实例运行中的(节点)任务信息
   act_ru_identitylink:流程实例运行中的参与者信息

当任务节点完成后,act_ru_task表,act_ru_execution表和act_hi_identitylink记录会清空,节约资源,提高效率;历史表会记录对应信息;

最后,我们可以查询流程办理历史信息,通过 HistoryService 历史数据对象来获取 HistoricActivityInstanceQuery 历史节点查询对象

 /**
     * 查询流程实例的办理历史节点信息
     */
    @Test
    public void historyInfo() {
        //1,获取流程引擎实例
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
​
        //2,历史相关的service
        HistoryService historyService = processEngine.getHistoryService();
​
        //3,获取查询对象
        HistoricActivityInstanceQuery query = historyService.createHistoricActivityInstanceQuery();
​
        //4,开始查询                                                    流程实例id
        List<HistoricActivityInstance> list = query.processInstanceId("5001")
                .orderByHistoricActivityInstanceStartTime()
                .asc()
                .list();
        for (HistoricActivityInstance hi : list) {
            System.out.println("流程定义id: " + hi.getProcessDefinitionId());
            System.out.println("流程实例id: " + hi.getProcessInstanceId());
            System.out.println("(节点)任务id: " + hi.getActivityId());
            System.out.println("节点名称: " + hi.getActivityName());
            System.out.println("任务办理人: " + hi.getAssignee());
        }
    }
流程定义id: leave:2:2504
流程实例id: 5001
(节点)任务id: start
节点名称: 开始
任务办理人: null
流程定义id: leave:2:2504
流程实例id: 5001
(节点)任务id: process1
节点名称: 经理审批
任务办理人: wsy1
流程定义id: leave:2:2504
流程实例id: 5001
(节点)任务id: process2
节点名称: 总监审批
任务办理人: wsy2
流程定义id: leave:2:2504
流程实例id: 5001
(节点)任务id: sid-29f8b024-d3ba-4573-8b2a-79ca6587c7fe
节点名称: null
任务办理人: null

当前(节点)任务完成!