• java工作流activiti的步骤


    链接:activiti 表名称的解释

    工作流从流程定义到创建一个流程实例完成执行步骤(省略bpmn的画法)

      工作流的所有操作都是使用流程引擎来进行操作的,流程引擎只是存储流程的过程,而不存储具体的业务数据,需要自行建立相关的表,工作流的特点是流程和业务的关联具体步骤如下。
    1. 创建流程引擎,也就是生成工作流所需要的23+张表。
    2. 流程引擎的部署。通过RepositoryService 进行部署,它是对应的就是流程的静态资源,将图片和bpmn上传至数据库。
    3. 使用activi-designer创建一个流程定义(.bpmn结尾的文件)
    4. 将定义好的流程定义和生成的png图片通过RepositoryService(前面章节说过主要是用来处理流程定义的service)的api上传到数据库
    5. 通过RuntimeService(这个service主要是处理当前正在运行的流程实例的)启动一个流程实例
    6. 这个时候通过TaskService(主要处理当前运行的任务,一个流程实例下有多个任务)获取到上面的实例所对应的当前人任务
    7. 结束上面的任务task,流程实例会走向下一个task任务
    8. 重复4,5,完成一个流程实例的启动到结束

      上面就是一个最简单从上往下执行的流程的执行步骤,本章节都是以代码做示例,代码不多,但是都执行一遍,你会对整个activiti的流程有个大概的了解

       

      创建流程引擎

        一般java中使用工作流,都是和spring框架结合进行使用的,具体情况后续添加。

      

    //普通方法的创建

    /*
    * * Description:创建流程引擎 * * @author cy * @date 2018年08月03日 16:34 * version 1.0 */ public class CreateEngine { public static void main(String[] args) { //流程引擎的创建,使用流程引擎配置文件,也就是创建23+张表 ProcessEngineConfiguration processEngineConfigurationFromResource = ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration(); //设置数据库信息 processEngineConfigurationFromResource.setJdbcUrl("jdbc:mysql://localhost:3306/cheng?useUnicode=true&characterEncoding=utf-8"); processEngineConfigurationFromResource.setJdbcDriver("com.mysql.jdbc.Driver"); processEngineConfigurationFromResource.setJdbcUsername("root"); processEngineConfigurationFromResource.setJdbcPassword("admin"); processEngineConfigurationFromResource.setDatabaseSchemaUpdate(processEngineConfigurationFromResource.DB_SCHEMA_UPDATE_TRUE);//对数据库进行更新 processEngineConfigurationFromResource.buildProcessEngine();//创建引擎 System.out.println("创建引擎成功"); } }

      流程部署

    /*
         * 获取流程引擎对象,下面的方法会默认查找classpath目录下的名称为activi.cfg.xml
         * 里面bean的id为processEngineConfiguration的ProcessEngineConfiguration引擎配置对象来获取ProcessEngine对象
        */    
        private ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
        
        //部署一个流程
        @Test
        public void deployProcessDefinition(){
            //根据引擎获取资源service
            RepositoryService repositoryService =   engine.getRepositoryService();
            //部署bpmn文件
            String bpmnName="purchasingflow.bpmn";
            InputStream bpmnIn = this.getClass().getClassLoader().getResourceAsStream("diagram/purchasingflow.bpmn");
            //部署bpmn生成的图片
            String pngName="purchasingflow.png";
            InputStream pngIn = this.getClass().getClassLoader().getResourceAsStream("diagram/purchasingflow.png");
            //添加这两个文件进行部署
            Deployment deployment = repositoryService.createDeployment()
                .addInputStream(bpmnName, bpmnIn)
                .addInputStream(pngName, pngIn)
                .deploy();
            
            System.out.println("部署id:"+deployment.getId());
            System.out.println("部署的name:"+deployment.getDeploymentTime());
            
        }

      查询流程的定义

    //查询流程定义
        @Test
        public void queryProcessDefinition(){
            
            RepositoryService repositoryService =   engine.getRepositoryService();
            //创建流程定义查询对象
            ProcessDefinitionQuery definitionQuery = repositoryService.createProcessDefinitionQuery();
            
            String processDefinitionKey = "purchasingflow";
            //设置流程定义的key的查询条件
            definitionQuery.processDefinitionKey(processDefinitionKey);
            //查询所有的流程定义
            List<ProcessDefinition> processDefinitionList = definitionQuery.list();
            for(ProcessDefinition definition:processDefinitionList){
                System.out.println("-------------------------");
                System.out.println("流程定义id:"+definition.getId());
                System.out.println("流程资源名:"+definition.getResourceName());
                System.out.println("流程部署id:"+definition.getDeploymentId());
            }
            
        
        }

      启动一个流程实例

    //启动一个流程实例
        @Test
        public void startProcessInstance(){
            
            RuntimeService runtimeService = engine.getRuntimeService();
            
            String processDefinitionKey = "purchasingflow";
            //根据流程定义的key启动一个流程实例
            ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey);
            System.out.println("流程实例id:"+processInstance.getId());
            System.out.println("流程定义id:"+processInstance.getProcessDefinitionId());
            
            
        }

      查询当前处理人的任务

    //查询当前用户的代办任务
        @Test
        public void queryProcessInstance(){
            
            //查询任务使用的service
            TaskService taskService = engine.getTaskService();
            //获取任务查询对象
            TaskQuery taskQuery = taskService.createTaskQuery();
            taskQuery.taskAssignee("zhangsan");
            //查询该条件下的所有的任务
            List<Task> tasks =taskQuery.list();
            for(Task task:tasks){
                System.out.println("当前任务id:"+task.getId());
                System.out.println("当前任务所属流程定义id:"+task.getProcessDefinitionId());
                System.out.println("当前任务的key:"+task.getTaskDefinitionKey());
            }
            
        }

      完成一个流程

    //完成一个流程
        @Test
        public void completeProcessInstance(){
            
            //任务的id,后期整合后会通过当前登录人身份查询到该用户的任务,然后获取到该id
            String taskId="402";
            TaskService taskService = engine.getTaskService();
            //根据任务id完成该任务
            taskService.complete(taskId);
            
        }
  • 相关阅读:
    each和foreach的区别
    apply和call的用法
    js小知识点
    关于react的一些疑问点
    c语言字符动画的实现
    解决'chromedriver' executable needs to be in PATH问题!
    二叉树的创建和遍历
    dns和dhcp
    编写一个application程序实现如下功能:接受命令行中给出的一个字符串,先将字符串原样输出,然后判断该穿的第一个字母是否为大写,若是大写则统计该串中大写字母的个数,并将所有大写字母输出。
    学生成绩管理系统究极版
  • 原文地址:https://www.cnblogs.com/chengyangyang/p/9407448.html
Copyright © 2020-2023  润新知