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

    全局监听器

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

    连线监听器

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

    节点监听器

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

  • 相关阅读:
    164 Maximum Gap 最大间距
    162 Find Peak Element 寻找峰值
    160 Intersection of Two Linked Lists 相交链表
    155 Min Stack 最小栈
    154 Find Minimum in Rotated Sorted Array II
    153 Find Minimum in Rotated Sorted Array 旋转数组的最小值
    152 Maximum Product Subarray 乘积最大子序列
    151 Reverse Words in a String 翻转字符串里的单词
    bzoj3994: [SDOI2015]约数个数和
    bzoj 4590: [Shoi2015]自动刷题机
  • 原文地址:https://www.cnblogs.com/feiqiangsheng/p/14411743.html
Copyright © 2011-2022 走看看