zoukankan      html  css  js  c++  java
  • Activiti 框架

    参考资料

    1、官方网站:https://www.activiti.org/

    Activiti 介绍

    Activiti 是一个开源的工作流引擎,它实现了 BPMN 2.0 规范,可以发布设计好的流程定义,并通过 API 进行流程调度。

    BPMN2.0 介绍

    BPMN(Business Process Modeling Notation)是一种业务流程模型标识的标准语言,用来绘制业务流程图,以便更好地让各部门之间理解业务流程和相互关系,旨在促进业务流程的沟通和理解。

    Activiti 相关表

    Activiti 框架能够自动生成相关的数据库表,非常的好用。下面介绍一下表的大致作用。

    1、ACT_RE_*: RE 表示 Repository。这个前缀的表包含了流程定义和流程静态资源(图片,规则,等等)。

    2、ACT_RU_*: RU 表示 Runtime。这个前缀的表包含流程实例,任务,变量,异步任务,等运行中的数据。

    3、ACT_HI_*: HI 表示 History。这个前缀的表包含历史数据,比如历史流程实例, 变量,任务等。

    4、ACT_GE_*: GE 表示 General。通用数据,用于不同场景下。

    5、ACT_ID_*: ID 代表 Identity。这些表中保存的都是身份信息,如用户和组以及两者之间的关系。

    Activiti 架构图

    1、ProcessEngine:流程引擎的抽象,可以通过此类获取需要的所有服务。
    2、XXXService:通过ProcessEngine获取,Activiti将不同生命周期的服务封装在不同Service中,包括定义、部署、运行。

    Activiti 流程部署

    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    RepositoryService repositoryService = processEngine.getRepositoryService();
    Deployment deployment = repositoryService.createDeployment()
          .addClasspathResource("approval.bpmn20.xml")
          .name("我的流程部署")
          .deploy();
    

    Activiti 流程启动

    RuntimeService runtimeService = processEngine.getRuntimeService();
    Map<String, Object> map = Maps.newHashMap();
    map.put("name", "zhangxingr");
    map.put("sex", "man");
    map.put("age", "21");
    ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("my-process", map);
    

    Activiti 流程查询

    List<Task> list = processEngine.getTaskService()
        .createTaskQuery()
        .taskAssignee("王五")
        .list();
    

    Activiti 流程提交

    ##任务的处理
    ```java
    processEngine.getTaskService()
          .complete("7502");  //参数是任务ID
    

    Activiti 流程定义查询

    List<ProcessDefinition> list = processEngine.getRepositoryService()//与流程定义和部署对象相关的Service
        .createProcessDefinitionQuery().list();
    

    Activiti 流程状态查询

    ProcessInstance pi = processEngine.getRuntimeService() // 获取运行时Service
        .createProcessInstanceQuery() // 创建流程实例查询
        .processInstanceId("2501") // 用流程实例id查询
        .singleResult();
    

    Activiti 流程定义删除

    processEngine.getRepositoryService()
          .deleteDeployment("deploymentId", true);
    

    Activiti 流程资源查看

    /**将生成图片放到文件夹下*/
    String deploymentId = "801";
    //获取图片资源名称
    List<String> list = processEngine.getRepositoryService()//
        .getDeploymentResourceNames(deploymentId);
    //定义图片资源的名称
    String resourceName = "";
    if(list!=null && list.size()>0){
        for(String name:list){
              if(name.indexOf(".png")>=0){
                    resourceName = name;
              }
        }
    }
    //获取图片的输入流
    InputStream in = processEngine.getRepositoryService()//
          .getResourceAsStream(deploymentId, resourceName);
    //将图片生成到D盘的目录下
    File file = new File("D:/"+resourceName);
    //将输入流的图片写到D盘下
    FileUtils.copyInputStreamToFile(in, file);
    

    Activiti 历史活动查询

    List<HistoricActivityInstance>  list = processEngine.getHistoryService()
        .createHistoricActivityInstanceQuery() // 创建历史活动实例查询
        .processInstanceId("2501") // 执行流程实例id
        .list();
    

    Activiti 历史任务查询

    List<HistoricTaskInstance> list = processEngine.getHistoryService() // 历史相关Service
        .createHistoricTaskInstanceQuery() // 创建历史任务实例查询
        .processInstanceId("2501") // 用流程实例id查询
        .list(); 
    

    Activiti 流程定义的挂起

    RepositoryService repositoryService = processEngine.getRepositoryService();
    String processDefinitionKey ="purchasingflow";
    //根据流程定义的key暂停一个流程定义,并且级联挂起该流程定义下的流程实例
    repositoryService.suspendProcessDefinitionByKey(processDefinitionKey, true, null);
    

    Activiti 流程实例的挂起

    RuntimeService runtimeService = engine.getRuntimeService();
    String processInstanceId="1801";
    //根据一个流程实例的id挂起该流程实例
    runtimeService.suspendProcessInstanceById(processInstanceId);
    

    UEL 分配任务

    任务节点设计的时候,assignce 设置为 ${assignee0},在启动的时候把这个变量带上,Activiti 就可以动态设置流程接收人。

    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    RuntimeService runtimeService=processEngine.getRuntimeService();
    //设置assignee的取值
    Map<String,Object> map=new HashMap<>();
    map.put("assignee0","xiaoyi");
    map.put("assignee1","xiaoer");
    map.put("assignee2","xiaosan");
    ProcessInstance processInstance=runtimeService.startProcessInstanceByKey("holiday",map);
    

    Activiti 监听器分配任务

    在流程设计的时候,指定监听器,在监听器中设置流程接收人,这样也可以动态的指定流程接收人。

    Activiti 流程变量

    在流程进行的过程可以附带一些数据,控制流程的走向,这些数据叫做流程变量。流程变量支持很多类型,包括 String,Integer,Java实体类。作用域分为节点作用域和全流程作用域。

    Activiti 查询组任务

    多个人都有权力处理某个单据,多个人处理的任务可以称为组任务。

    TaskService taskService = processEngine.getTaskService();
    String key="myProcess5";
    String candidateUser="zhangsan";
    //查询
    List<Task> list = taskService.createTaskQuery().processDefinitionKey(key).taskCandidateUser(candidateUser).list();
    

    Activiti 拾取组任务

    TaskService taskService = processEngine.getTaskService();
    //设置查询条件
    String key="myProcess5";
    String candidateUser="zhangsan";
    //查询
    Task task = taskService.createTaskQuery().processDefinitionKey(key).taskCandidateUser(candidateUser).singleResult();
    if (task!=null){
        taskService.claim(task.getId(),candidateUser);
        System.out.println("任务拾取完毕!");
    }
    

    Activiti 候选人完成组任务

    TaskService taskService = processEngine.getTaskService();
    //设置查询条件
    String key = "myProcess5";
    String assignee = "zhangsan";
     //查询
    List<Task> list = taskService.createTaskQuery().processDefinitionKey(key).taskAssignee(assignee)//设置任务处理人
        .list();
    for (Task task : list) {
        taskService.complete(task.getId());
        System.out.println("任务执行完毕");
    }
    

    Activiti 归还组任务

    //获取taskService
    TaskService taskService = processEngine.getTaskService();
    //设置查询条件
    String key = "myProcess5";
    String assignee = "zhangsan";
    String candidateUser = "lishi";
    //查询
    Task task = taskService.createTaskQuery().processDefinitionKey(key).taskAssignee(assignee)//设置任务处理人
        .singleResult();
    if (task!=null){
        taskService.setAssignee(task.getId(),null);//把任务归还,把任务执行人设置为 null
        //taskService.setAssignee(task.getId(),candidateUser); 张三把当前任务指定给 lisi 处理
        System.out.println("任务归还完毕");
    }
    

    网关介绍

    1、排他网关:请假申请,三天以内,部门经理审批流程就结束了,三天以上需要总经理。

    2、并行网关:请假申请,需要项目经理和部门经理都审批,两者不分前后,需要两个人全部审批才能进入下个节点。

    3、包含网关:你申请请假,如果是病假,找项目经理+财务审批,如果不是找部门经理+财务审批,三者不分前后。说白了就像是排他网关跟并行网关的合体。

    全局监听器

    全局监听器主要使用的场景就是监控这个流程的启动和结束。

    连线监听器

    当节点任务完成的时候,经过连线的时候,我们可以在连线上定义类,实现自己的业务逻辑。

    节点监听器

    在实际项目开发中,任务节点是经常用到的,所以我们必须要会使用节点监听器。

  • 相关阅读:
    对单片机程序中.data、.bss和.text三种数据的解读
    单片机驱动-软件模拟SPI
    MKL25-Low-Power Timer (LPTMR)
    使用intellij idea 查看Java字节码
    2.1 并发编程之java内存模型JMM & synchronize & volatile详解
    1.操作系统底层工作的基本原理
    JDBC(1)-数据库连接和CRUD操作
    Java反射详解
    Java Web(5)-Servlet详解(下)
    Java Web(5)-Servlet详解(上)
  • 原文地址:https://www.cnblogs.com/feiqiangsheng/p/14411743.html
Copyright © 2011-2022 走看看