activiti7 快速体验

定义工作流程图

要使用 activiti ,当然要先画好流程图。创建一个 bpmn 文件,本例流程图如下:
在这里插入图片描述
在这里插入图片描述

流程定义好后,中文可能会乱码。如何解决中文乱码呢:
1)找到 IDEA 的安装路径,打开 .vmoptions 文件,在末尾加入一行
在这里插入图片描述

-Dfile.encoding=UTF-8

2)在这两个文件加了上面这句如果还没解决,打开下图的文件也加入这句。
在这里插入图片描述
3)如果还不行,请重启开发工具;如果还不行,请重启电脑;再不行,我也没辙了,只能问度娘了

我就是重启了电脑后才不乱码的

流程定义的部署

定义好流程后,需要部署到 activiti 引擎中;在部署前,需要准备流程图的 bpmn 文件和 png 文件。在 eclipse 中,可以把 bpmn 文件直接保存为 png 格式。
在 IDEA 中,需通过 xml 文件转化一下:

a.选中 bpmn 文件,ctrl + c ,ctrl + v ,直接把复制的文件改为 .xml
b.用 bpmn 打开该 xml 文件
在这里插入图片描述

c.另存为 .png 文件,放到项目中即可。
在这里插入图片描述
准备好流程图后,开始部署,步骤如下:
1)得到ProcessEngine对象
2)得到RepositoryService对象
3)进行部署
4)输出部署的相关信息

/**
 * 流程定义的部署
 */
public class ActivitiDeployment {
    
    
    public static void main(String[] args) {
    
    
        //1、创建 ProcessEngine 对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //2、获取 RepositoryService 实例
        RepositoryService repositoryService = processEngine.getRepositoryService();
        //3、部署
        Deployment deployment = repositoryService.createDeployment()
                                                .addClasspathResource("diagram/holiday_process.bpmn")
                                                .addClasspathResource("diagram/holiday_process.png")
                                                .name("请假申请流程").deploy();
        //4、查看结果
        System.out.println(deployment.getName());
        System.out.println(deployment.getId());
    }
}

涉及的activiti表,执行上面的 main 方法,下面三个表会保存流程的定义信息

act_re_deployment : 部署信息
act_re_procdef : 流程定义的相关信息
act_ge_bytearray : 流程定义的bpmn文件及png文件

第二种部署方式:zip 包部署

    //新建文件夹,把 .bpmn 文件和 .png 文件放入文件夹,再把改文件夹压缩成 zip 包
    public static void deployedByZip() {
    
    
        //1、创建 ProcessEngine 对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //2、获取 RepositoryService 实例
        RepositoryService repositoryService = processEngine.getRepositoryService();
        //3、读取文件并创建 zip 流
        InputStream inputStream = ActivitiDeployment.class.getClassLoader().getResourceAsStream("diagram/holiday_process.zip");
        ZipInputStream zipInputStream = new ZipInputStream(inputStream);
        //4、部署
        Deployment deployment = repositoryService.createDeployment()
                .addZipInputStream(zipInputStream)
                .name("请假申请流程").deploy();
        //5、查看结果
        System.out.println(deployment.getName());
        System.out.println(deployment.getId());
    } 

在这里插入图片描述

流程实例的启动

要启动流程,首先必须已经完成流程定义的部署工作
1)得到 ProcessEngine 对象
2)得到 RuntimeService 对象
3)启动流程,创建流程实例,需要知道流程定义的 key
获取key的方法:
a. 查看 act_re_procdef 表中的字段 key;
b. 在IDE中查看.bpmn文件的id属性

    public static void startInstance() {
    
    
        //1、获取 ProcessEngine 对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //2、获取 RuntimeService 对象
        RuntimeService runtimeService = processEngine.getRuntimeService();
        //3、创建流程实例,需要流程定义的 key
        ProcessInstance holiday_process = runtimeService.startProcessInstanceByKey("holiday_process");

        System.out.println("流程部署ID===="+holiday_process.getDeploymentId());
        System.out.println("流程定义ID===="+holiday_process.getProcessDefinitionId());
        System.out.println("流程实例ID===="+holiday_process.getId());
        System.out.println("运行中流程ID===="+holiday_process.getActivityId());
    }

涉及的activiti表,启动流程后,在如下的表中会增加会更新数据
act_hi_actinst:已完成的活动信息
act_hi_identitylink:参与者信息
act_hi_procinst:流程实例
act_hi_taskinst:任务实例
act_ru_execution:执行表
act_ru_identitylink:参与者信息
act_ru_task:任务

任务查询

查询任务首先需要知道查谁的任务,因为流程刚启动,当然是先查第一个节点的任务操作人了。
本例中是 Tom 需要填写请假条

    public static void findTaskList() {
    
    
        //1、获取 ProcessEngine 对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //2、获取 TaskService 对象
        TaskService taskService = processEngine.getTaskService();
        //3、根据 key 和 当前实例任务负责人 进行查询
        List<Task> taskList = taskService.createTaskQuery().processDefinitionKey("holiday_process")
                                                            .taskAssignee("Tom").list();
        //查看
        for (Task task: taskList) {
    
    
            System.out.println("流程实例ID====" + task.getProcessInstanceId());
            System.out.println("任务ID====" + task.getId());
            System.out.println("任务名称====" + task.getName());
            System.out.println("任务负责人====" + task.getAssignee());
        }
    }

在这里插入图片描述

处理任务

查询到任务后,就可以处理任务,只要把任务 id 出入即可完成任务
1)得到 ProcessEngine 对象
2)得到 TaskService 对象
3)传入任务ID,处理任务

    public static void handTask() {
    
    
        //1、获取 ProcessEngine 对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //2、获取 TaskService 对象
        TaskService taskService = processEngine.getTaskService();
        //3、处理任务,传入任务ID
        taskService.complete("5005");

    }

任务处理会更新如下表的数据:

act_hi_actinst:当前任务有了结束时间,并插入了下一条待办任务
act_hi_identitylink:增加了一条数据
act_hi_taskinst:当前任务有了结束时间,并插入了下一条待办任务
act_ru_identitylink:增加了一条数据
act_ru_task:删除了已完成的任务,只有一条等待处理的任务;如果该流程任务都完成了,则没有数据了;act_ru*同理,结束了就不属于运行时了
在这里插入图片描述
到这里,Tom 就写好请假条并提交了,Tom 的任务算完成了,等着领导同意就行啦

以上,就是最简单的 activiti7 快速体验了

猜你喜欢

转载自blog.csdn.net/Alias_fa/article/details/107295963
今日推荐