天天看点

Activiti工作流的入门

今天学习使用了Activiti,使用过程中的一些认识写出来。

https://www.activiti.org/download-links

首先就是下载源码包,使用的是5.22.0,下载好之后直接去Navicat Premuim创建数据库,执行sql,但是不知道为什么只有23张表,没有act_evt_log表与act_procdef_info两张表,然后使用IDEA通过java代码创建了表,这次是25张表。导入jar包,创建spring-config资源文件,然后执行测试代码。

@Test
public void createTable() {
    ProcessEngineConfiguration configuration =
            ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml");
    //ProcessEngines.getDefaultProcessEngine();
    ProcessEngine processEngine = configuration.buildProcessEngine();
    System.out.println(processEngine);
}
           

导入actiBPM插件的时候,如果File->Settings->Plugins没有找到actiBPM,可以选择下方Browse repositories搜索,这时还有可能直接下载不成功,显示不能连接官网,可以复制网址浏览器打开,直接下载,然后下载好之后,选择Install plugin from disk,找到刚才的jar包路径,下载成功,这时可以创建BPMN file,也就是activiti工作流的流程图。

创建一个测试类,并且创建全局变量processEngine流程引擎

ProcessEngineConfiguration configuration =
            ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml");
    //创建流程引擎,之后的步骤需要用到
    ProcessEngine processEngine = configuration.buildProcessEngine();
           

添加测试方法,启动一个流程,运行之后,act_hi_taskinst,act_ru_task,act_ru_execution三张表都会自动添加一条数据。hi是历史记录,会根据操作增加数据,ru记录运行时程序,会根据操作更新数据

@Test
    public void startProcess() {
        //启动一个流程
        RuntimeService runtimeService = processEngine.getRuntimeService();
        //key是bpmn的id,根据bpmn文件而定,act_re_procdef中的KEY_,
        runtimeService.startProcessInstanceByKey("leave1801");
    }
           

这时可以查询出来流程的某些操作数据,如果开启两个流程,list的size就是2,这里需注意如果同时有打印语句与提交流程语句,那么控制台不会输出要打印的数据,但是数据库已经被提交更新。如果需要查看流程的一些数据,可以注释掉提交语句。act_hi_taskinst表增加对应流程数的数据,act_ru_task更新为当前流程,act_ru_execution也是会更新为当前流程

@Test
    public void queryZhangSanTask() {
        String assignee = "chang";
        List<Task> taskList = processEngine.getTaskService()//获取任务service
                .createTaskQuery()//创建查询对象
                .taskAssignee(assignee)//指定查询人
                .list();
        for (Task task : taskList) {
            System.out.println("代办任务ID:" + task.getId());
            System.out.println("代办任务name:" + task.getName());
            System.out.println("代办任务创建时间:" + task.getCreateTime());
            System.out.println("代办任务办理人:" + task.getAssignee());
            System.out.println("流程实例ID:" + task.getProcessInstanceId());
            System.out.println("执行对象ID:" + task.getExecutionId());
            //提交任务到下一个代理人,如果存在这一句,上面不会输出打印,即便assignee是当前的执行人也不会打印,但是数据库中数据已经改变
            //如果assignee不是当前执行人,即便没有下面这一句,也查询不到数据,因为当前不是这个人
            //当全部流程执行结束,
            processEngine.getTaskService().complete(task.getId());
        }
    }
           

当提交完当前操作人的操作之后,更改下面数据,根据bpmn文件中写的流程assignee数据。

String assignee = "meng";
           

当全部流程操作结束之后,会发现act_ru_task,act_ru_execution两张表中对应流程的数据被删除,act_hi_taskinst表记录了完整流程数据。此时可以查看完整流程的起止时间。processInstanceId("")中根据act_hi_taskinst表中PROC_INST_ID_字段值确定。

@Test
    public void viewHistory() {
        HistoryService historyService = processEngine.getHistoryService();
        HistoricProcessInstance historicProcessInstance =
                historyService
                        .createHistoricProcessInstanceQuery()
                        .processInstanceId("12501").singleResult();
        System.out.println("开始时间:" + historicProcessInstance.getStartTime());
        System.out.println("结束时间:" + historicProcessInstance.getEndTime());
    }
           

继续阅读