Activiti工作流

1.Activiti的表说明

使用25张表:
ACT_GE_ (GE) 表示 general 全局通用数据及设置,各种情况都使用的数据。
ACT_HI_ (HI) 表示 history 历史数据表,包含着程执行的历史相关数据,如结束的流程实例,变量,任务,等等
ACT_ID_ (ID) 表示 identity 组织机构,用户记录,流程中使用到的用户和组。这些表包含标识的信息,如用户,用户组,等等。
ACT_RE_ (RE) 表示 repository 存储,包含的是静态信息,如,流程定义,流程的资源(图片,规则等)。
ACT_RU_ (RU) 表示 runtime 运行时,运行时的流程变量,用户任务,变量,职责(job)等运行时的数据。Activiti 只存储实例执行期间的运行时数据,当流程实例结束时,将删除这些记录。这就保证了这些运行时的表小且快。

25 张表详情

一般数据 (ACT_GE_)
ACT_GE_BYTEARRAY 二进制数据表,存储通用的流程定义和流程资源。
ACT_GE_PROPERTY 系统相关属性,属性数据表存储整个流程引擎级别的数据,初始化表结构时,会默认插入三条记录。

流程历史记录 (ACT_HI_)
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_)
ACT_ID_GROUP 用户组信息表
ACT_ID_INFO 用户扩展信息表
ACT_ID_MEMBERSHIP 用户与用户组对应信息表
ACT_ID_USER 用户信息表

流程定义表 (ACT_RE_)
ACT_RE_DEPLOYMENT 部署信息表
ACT_RE_MODEL 流程设计模型部署表
ACT_RE_PROCDEF 流程定义数据表

运行实例表 (ACT_RU_)
ACT_RU_EVENT_SUBSCR 运行时事件 throwEvent、catchEvent 时间监听信息表
ACT_RU_EXECUTION 运行时流程执行实例
ACT_RU_IDENTITYLINK 运行时流程人员表,主要存储任务节点与参与者的相关信息
ACT_RU_JOB 运行时定时任务数据表
ACT_RU_TASK 运行时任务节点表
ACT_RU_VARIABLE 运行时流程变量数据表

其它
ACT_EVT_LOG 事件日志
ACT_PROCDEF_INFO 流程定义的动态变更信息

2.Activiti的架构,类关系图

获取流程引擎的工具类

  • ProcessEngines.使用默认方式获取配置文件,构造流程引擎.配置文件名字activiti.cfg.xml,放在 classpath下
  • ProcessEngineConfiguration 可以自定义配置文件名

使用上面2个工具类,都可以获得流程引擎

  • ProcessEngine 流程引擎. 获取各种服务接口.
  • 服务接口 用于流程的部署, 执行, 管理, 使用这些接口就是在操作对应的数据表
  • RepositoryService 资源管理类
  • RuntimeService 运行时管理类
  • TaskService 任务管理类
  • HistoryService 历史数据管理类
  • ManagementService 流程引擎管理类

3.BPMN插件

idea安装actiBPM插件
在这里插入图片描述

4.流程符号, 画流程图

  • 流程符号: 事件Event, 活动Activity, 网关 Gateway, 流向
  • 使用流程设计器画出流程图
  • bpmn文件本质上是xml文件,因为安装 actiBPM插件,才能可视化的看得到流程内容
  • 创建bpmn文件, 在流程设计器使用流程符号来表达流程. 指定流程的Key, 指定任务负责人
  • 生成PNG文件, 把bpmn文件后缀改为xml, 在这个文件邮件选择Diagrams->show BPMN2.0 Desinger,
    打开窗口,点击导出文件按钮
  • 选择导出文件类型为PNG. 要注意乱码问题

5.流程部署

使用Activiti提供的API把流程图的内容写入数据库中, 属于资源类操作, 使用RepositoryService

  • 部署操作表:
    act_re_deployment 部署表
    act_re_procdef 流程定义表
    act_ge_bytearray 资源表

单文件部署: 把bpmn文件和png文件一个一个处理

@Test
public void testDeployment() {
    //1.创建ProcessEngine
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    //2.获取RepositoryService
    RepositoryService repositoryService = processEngine.getRepositoryService();
    //3.使用service进行流程的部署,定义一个流程的名字,把bpmn和png部署到数据中
    Deployment deploy = repositoryService.createDeployment()
            .name("businessTravelRequest")
            .addClasspathResource("bpmn/evection.bpmn")
            .addClasspathResource("bpmn/evection.png")
            .deploy();
    //4.输出部署信息
    System.err.println("流程部署id=" + deploy.getId());
    System.err.println("流程部署名字=" + deploy.getName());
}

压缩包部署: 把bpmn文件和png打zip压缩包来处理
Deployment deploy = repositoryService.createDeployment

@Test
public void deployProcessByZip() {
    //获取流程引擎
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    //获取RepositoryService
    RepositoryService repositoryService = processEngine.getRepositoryService();
    //流程部署
    //读取资源包文件 构造成inputStream
    InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("bpmn/evection.zip");
    //用inputStream 构造ZipInputStream
    ZipInputStream zipInputStream = new ZipInputStream(inputStream);
    //使用压缩包的流进行流程的部署
    Deployment deploy = repositoryService.createDeployment().addZipInputStream(zipInputStream).deploy();
    System.err.println("流程部署的id= " + deploy.getId());
    System.err.println("流程部署的名称= " + deploy.getName());
}

6.启动流程实例

使用RuntimeService根据流程定义的Key

  • 操作表:
    act_hi_actinst 流程实例执行历史信息
    act_hi_identitylink 流程参与用户的历史信息
    act_hi_procinst 流程实例的历史信息
    act_hi_taskinst 流程任务的历史信息
    act_ru_execution 流程执行信息
    act_ru_identitylink 流程的正在参与用户信息
    act_ru_task 流程当前任务信息
@Test
public void testStartProcess() {
    //1.创建ProcessEngine
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    //2.获取RunTimeService
    RuntimeService runtimeService = processEngine.getRuntimeService();
    //3.根据流程定义的id启动流程
    ProcessInstance instance = runtimeService.startProcessInstanceByKey("myEvection");
    //4.输出内容
    System.err.println("流程定义ID:" + instance.getProcessDefinitionId());
    System.err.println("流程实例ID:" + instance.getId());
    System.err.println("当前活动的ID:" + instance.getActivityId());
}

7.查询个人待执行的任务

使用TaskService, 根据流程定义的Key, 任务的负责人来进行查询

    @Test
    public void testFindPersonalTaskList() {
        //1.获取流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //2.获取taskService
        TaskService taskService = processEngine.getTaskService();
        //3.根据流程key和任务的负责人查询任务
        List<Task> taskList = taskService.createTaskQuery().processDefinitionKey("myEvection").taskAssignee("zhangsan").list();
        //4.输出(快捷键iter)
        for (Task task : taskList) {
            System.err.println("流程实例id=" + task.getProcessInstanceId());
            System.err.println("任务Id=" + task.getId());
            System.err.println("任务负责人=" + task.getAssignee());
            System.err.println("任务名称=" + task.getName());
        }
    }

8.任务个人完成

使用TaskService, 用任务Id完成任务

    @Test
    public void completTask() {
        //获取流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //获取service
        TaskService taskService = processEngine.getTaskService();
        //根据任务id完成任务
        //taskService.complete("17505");
        //获取jerry myEvection对应的任务
        //Task task = taskService.createTaskQuery().processDefinitionKey("myEvection").taskAssignee("jerry").singleResult();
        //完成jack的任务
        //Task task = taskService.createTaskQuery().processDefinitionKey("myEvection").taskAssignee("jack").singleResult();
        //完成Rose的任务
        Task task = taskService.createTaskQuery().processDefinitionKey("myEvection").taskAssignee("rose").singleResult();
        
        System.err.println("流程实例id=" + task.getProcessInstanceId());
        System.err.println("任务Id=" + task.getId());
        System.err.println("任务负责人=" + task.getAssignee());
        System.err.println("任务名称=" + task.getName());
        
//        完成jerry的任务 、完成jack的任务、完成rose的任务
        taskService.complete(task.getId());
    }

9.查询流程定义

@Test
public void queryProcessDefinition() {
    //获取引擎
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    //获取Repositoryservice
    RepositoryService repositoryService = processEngine.getRepositoryService();
    //获取ProcessDifinitionQuery对象
    ProcessDefinitionQuery definitionQuery = repositoryService.createProcessDefinitionQuery();
    //查询当前所有的流程定义,返回流程定义信息的集合
    //processDefinitionKey(流程定义key)
    //orderByProcessDefinitionVersion 进行排序
    //desc 倒序
    List<ProcessDefinition> definitionList = definitionQuery.processDefinitionKey("myEvection")
            .orderByProcessDefinitionVersion()
            .desc()
            .list();
    //输出信息
    for (ProcessDefinition processDefinition : definitionList) {
        System.err.println("流程定义ID: " + processDefinition.getId());
        System.err.println("流程定义名称: " + processDefinition.getName());
        System.err.println("流程定义Key: " + processDefinition.getKey());
        System.err.println("流程定义版本: " + processDefinition.getVersion());
        System.err.println("流程部署ID: " + processDefinition.getDeploymentId());
    }
}

10.删除流程部署信息

当前的流程如果并没有完成,想要删除的话需要使用特殊的方式,原理就是级联删除

@Test
public void deleteDeployMent(){
    //获取流程引擎
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    //通过引擎来获取 RepositoryService
    RepositoryService repositoryService = processEngine.getRepositoryService();
    //通过部署id来删除流程部署信息
    String deploymentId = "60001";
    //repositoryService.deleteDeployment(deploymentId);
    repositoryService.deleteDeployment(deploymentId, true);
}

11.下载资源文件

方案1: 使用Activiti提供的api,来下载资源文件
方案2: 自己写代码从数据库中下载文件,使用jdbc对blob类型,clob类型数据读取出来
保存到文件目录 解决io操作:commons-io.jar
这里使用方案1

    @Test
    public void getDeployment() throws IOException {
//         1、得到引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        2、获取api,RepositoryService
        RepositoryService repositoryService = processEngine.getRepositoryService();
//        3、获取查询对象 ProcessDefinitionQuery查询流程定义信息
        ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
                .processDefinitionKey("myEvection")
                .singleResult();
//        4、通过流程定义信息,获取部署ID
        String deploymentId = processDefinition.getDeploymentId();
//        5、通过RepositoryService ,传递部署id参数,读取资源信息(png 和 bpmn)
//          5.1、获取png图片的流
//        从流程定义表中,获取png图片的目录和名字
        String pngName = processDefinition.getDiagramResourceName();
//        通过 部署id和 文件名字来获取图片的资源
        InputStream pngInput = repositoryService.getResourceAsStream(deploymentId, pngName);
//          5.2、获取bpmn的流
        String bpmnName = processDefinition.getResourceName();
        InputStream bpmnInput = repositoryService.getResourceAsStream(deploymentId, bpmnName);
//        6、构造OutputStream流
        File pngFile = new File("d:/evectionflow01.png");
        File bpmnFile = new File("d:/evectionflow01.bpmn");
        FileOutputStream pngOutStream = new FileOutputStream(pngFile);
        FileOutputStream bpmnOutStream = new FileOutputStream(bpmnFile);
//        7、输入流,输出流的转换
        IOUtils.copy(pngInput,pngOutStream);
        IOUtils.copy(bpmnInput,bpmnOutStream);
//        8、关闭流
        pngOutStream.close();
        bpmnOutStream.close();
        pngInput.close();
        bpmnInput.close();
    }

12.查看历史信息

    @Test
    public void findHistoryInfo(){
//      获取引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        获取HistoryService
        HistoryService historyService = processEngine.getHistoryService();
//        获取 actinst表的查询对象
        HistoricActivityInstanceQuery instanceQuery = historyService.createHistoricActivityInstanceQuery();
//        查询 actinst表,条件:根据 InstanceId 查询
//        instanceQuery.processInstanceId("17501");
//        查询 actinst表,条件:根据 DefinitionId 查询
        instanceQuery.processDefinitionId("myEvection:1:15004");
//        增加排序操作,orderByHistoricActivityInstanceStartTime 根据开始时间排序 asc 升序
        instanceQuery.orderByHistoricActivityInstanceStartTime().asc();
//        查询所有内容
        List<HistoricActivityInstance> activityInstanceList = instanceQuery.list();
//        输出
        for (HistoricActivityInstance hi : activityInstanceList) {
            System.out.println(hi.getActivityId());
            System.out.println(hi.getActivityName());
            System.out.println(hi.getProcessDefinitionId());
            System.out.println(hi.getProcessInstanceId());
        }
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KK的号

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值