zoukankan      html  css  js  c++  java
  • Activiti7体系架构

    一.Activiti7体系架构
    通过加载activiti.cfg.xml文件得到ProcessEngineConfiguration对象,通过ProcessEngineConfiguration对象可以得到ProcessEngine对象
    得到该对象后,可以通过流程引擎对象ProcessEngine来得到各种Service,每一种Service接口有每个用途
    RepositoryService activiti 的资源管理类
    RuntimeService activiti 的流程运行管理类
    TaskService activiti 的任务管理类
    HistoryService activiti 的历史管理类
    ManagerService activiti 的引擎管理类


    二.Activiti使用步骤:
    1.流程定义
    使用Activiti Designer工具创建流程图

    新建一个BPMNFile流程图,可更改该流程图的ID和每个任务环节的执行人,流程图就是一个xml文件,每一个流程需要生成一张流程图保存,首先将.bpmn文件改为.xml文件
    然后右键该xml文件Diagrams--->show BPMN 2.0 Designer就能生成一张流程图,将流程图导出保存到项目对应目录即可,然后将xml改回bpmn即可



    2.流程部署
    需要将流程部署到Activiti当中,代表当前有该流程
    /**
    * 流程部署
    * `act_ge_bytearray` 流程定义的资源信息,包含bpmn和png流程文件信息
    * `act_re_deployment` 流程部署信息,包含流程名称,ID,Key等
    * `act_re_procdef` 流程定义信息
    */
    @Test
    public void deployment(){
    //获取ProcessEngine对象 默认配置文件名称:activiti.cfg.xml 并且configuration的Bean实例ID为processEngineConfiguration
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    //获取RepositoryService对象进行流程部署
    RepositoryService repositoryService = processEngine.getRepositoryService();
    //进行部署,将对应的流程定义文件生成到数据库当中,作为记录进行保存
    Deployment deployment = repositoryService.createDeployment()
    .addClasspathResource("bpmnfile/holiday.bpmn") //加载流程文件
    .addClasspathResource("bpmnfile/holiday.png")
    .name("请假流程") //设置流程名称
    .key("holidayKey")
    .deploy(); //部署

    //输出部署信息
    System.out.println("流程名称:"+deployment.getName());
    System.out.println("流程ID:"+deployment.getId());
    System.out.println("流程Key:"+deployment.getKey());
    }




    3.创建流程实例
    流程定义相当于类
    流程实例相当于类的实例(对象)

    /**
    * 启动流程实例
    * `act_hi_actinst` 已开始和执行完毕的活动信息
    * `act_hi_identitylink` 历史参与者信息
    * `act_hi_procinst` 流程实例信息
    * `act_hi_taskinst` 历史任务实例
    * act_ru_execution 任务执行信息
    * act_ru_identitylink 当前任务参与者
    * `act_ru_task` 任务信息
    *
    */
    @Test
    public void startInstance(){
    //获取ProcessEngine对象 默认配置文件名称:activiti.cfg.xml 并且configuration的Bean实例ID为processEngineConfiguration
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    //获取到RuntimeService对象
    RuntimeService runtimeService = processEngine.getRuntimeService();
    //创建流程实例
    ProcessInstance holiday = runtimeService.startProcessInstanceByKey("holiday");
    //输出实例信息
    System.out.println("流程部署ID:"+holiday.getDeploymentId());
    System.out.println("流程实例ID:"+holiday.getId());
    System.out.println("活动ID:"+holiday.getActivityId());
    }


    4.用户查询代办任务
    /**
    * 查看代办任务
    */
    @Test
    public void getTask(){
    //获取ProcessEngine对象 默认配置文件名称:activiti.cfg.xml 并且configuration的Bean实例ID为processEngineConfiguration
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    //获取一个TaskService对象
    TaskService taskService = processEngine.getTaskService();
    //查询代办业务 createTaskQuery查询任务 taskCandidateOrAssigned查询任务执行者 processDefinitionKey:查询流程
    /**
    * taskCandidateOrAssigned匹配规则:1.Assigned 2.配置bpmn文件中定义的值
    * taskAssignee匹配规则:1.Assigned
    */
    /*List<Task> list = taskService.createTaskQuery().taskCandidateOrAssigned("lisi").processDefinitionKey("holiday").list();*/
    List<Task> list = taskService.createTaskQuery().taskAssignee("zhangsan").processDefinitionKey("holiday").list();
    //分页:List<Task> list = taskService.createTaskQuery().taskAssignee("zhangsan").processDefinitionKey("holiday").listPage(i,j);
    for (Task task:list) {
    System.out.println("任务名称:"+task.getName());
    System.out.println("任务执行人:"+task.getAssignee());
    System.out.println("任务ID:"+task.getId());
    System.out.println("流程实例ID:"+task.getProcessInstanceId());
    }
    }


    5.用户进行任务处理
    /**
    * 任务处理:当所有任务处理完毕,对应当前流程实例信息删除,但是可以在历史中查看到该信息
    */
    @Test
    public void completeTask(){
    //获取ProcessEngine对象 默认配置文件名称:activiti.cfg.xml 并且configuration的Bean实例ID为processEngineConfiguration
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    //获取一个TaskService对象
    TaskService taskService = processEngine.getTaskService();
    //任务处理
    taskService.complete("10002");
    }



    6.流程结束

    7.当业务流程结束后通过历史可以查看到已经走完的流程
    /**
    * 查看历史任务
    */
    @Test
    public void getHistory() {
    //获取ProcessEngine对象 默认配置文件名称:activiti.cfg.xml 并且configuration的Bean实例ID为processEngineConfiguration
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    //获取HistoryService接口
    HistoryService historyService = processEngine.getHistoryService();
    //获取历史任务
    HistoricActivityInstanceQuery historicActivityInstanceQuery = historyService.createHistoricActivityInstanceQuery();
    //获取指定流程实例的任务
    historicActivityInstanceQuery.processInstanceId("2501");
    //获取任务列表
    List<HistoricActivityInstance> list = historicActivityInstanceQuery.list();
    for (HistoricActivityInstance ai : list) {
    System.out.println("任务节点ID:"+ai.getActivityId());
    System.out.println("任务节点名称:"+ai.getActivityName());
    System.out.println("流程实例ID信息:"+ai.getProcessDefinitionId());
    System.out.println("流程实例ID信息:"+ai.getProcessInstanceId());
    System.out.println("==============================");
    }
    }

     1 编写activiti.cfg.xml配置文件

     
     <!--数据源-->
        <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
            <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
            <property name="url" value="jdbc:mysql://localhost:3306/activiti-y2170"/>
            <property name="username" value="root"/>
            <property name="password" value="123"/>
        </bean>
    
        <!--配置Activiti使用的processEngine对象   默认命名为processEngineConfiguration-->
        <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
            <!--注入数据源-->
            <property name="dataSource" ref="dataSource"/>
            <!--配置数据源方式二:-->
            <!--<property name="jdbcDriver" value="com.mysql.jdbc.Driver"/>-->
    
            <!--指定数据库生成策略-->
            <property name="databaseSchemaUpdate" value="true"/>
        </bean>
     

      2编写日志配置文件

     
    # Set root category priority to INFO and its only appender to CONSOLE.
    #log4j.rootCategory=INFO, CONSOLE            debug   info   warn error fatal
    log4j.rootCategory=debug, CONSOLE, LOGFILE
    
    # Set the enterprise logger category to FATAL and its only appender to CONSOLE.
    log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE
    
    # CONSOLE is set to be a ConsoleAppender using a PatternLayout.
    log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
    log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
    log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m
    
    
    # LOGFILE is set to be a File appender using a PatternLayout.
    log4j.appender.LOGFILE=org.apache.log4j.FileAppender
    log4j.appender.LOGFILE.File=d:axis.log
    log4j.appender.LOGFILE.Append=true
    log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
    log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m
    
     

       3 编写测试代码进行部署 

     
     @Test
        public void deployment(){
            //获取ProcessEngine对象   默认配置文件名称:activiti.cfg.xml  并且configuration的Bean实例ID为processEngineConfiguration
            ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
            //获取RepositoryService对象进行流程部署
            RepositoryService repositoryService = processEngine.getRepositoryService();
            //进行部署,将对应的流程定义文件生成到数据库当中,作为记录进行保存
            Deployment deployment = repositoryService.createDeployment()
                    .addClasspathResource("bpmnfile/holiday.bpmn")     //加载流程文件
                    .addClasspathResource("bpmnfile/holiday.png")
                    .name("请假流程")       //设置流程名称
                    .key("holidayKey")
                    .deploy();              //部署
    
            //输出部署信息
            System.out.println("流程名称:"+deployment.getName());
            System.out.println("流程ID:"+deployment.getId());
            System.out.println("流程Key:"+deployment.getKey());
        }
     

      编写测试代码 

     
    @Test
        public void startInstance(){
            //获取ProcessEngine对象   默认配置文件名称:activiti.cfg.xml  并且configuration的Bean实例ID为processEngineConfiguration
            ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
            //获取到RunimeService对象
            RuntimeService runtimeService=processEngine.getRuntimeService() ;
            //创建流程实例
            ProcessInstance holiday=runtimeService.startProcessInstanceByKey("holiday");
            //输出实例信息
            System.out.println("流程部署ID:"+holiday.getDeploymentId());
            System.out.println("流程实例ID:"+holiday.getId());
            System.out.println("活动 ID:"+holiday.getActivityId());
        }
     

     4. 用户查询代办任务

      代码测试

     
     //查看代办任务
        @Test
        public void getTask(){
            //获取ProcessEngine对象   默认配置文件名称:activiti.cfg.xml  并且configuration的Bean实例ID为processEngineConfiguration
            ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
            //获取一个TaskService对象
            TaskService taskService=processEngine.getTaskService();
            //查询代办业务 createTaskQuery查询任务   taskCandidateOrAssigned查询任务执行者   processDefinitionKey:查询流程
            /**
             * taskCandidateOrAssigned匹配规则:1.Assigned   2.配置bpmn文件中定义的值
             * taskAssignee匹配规则:1.Assigned
             */
            List<Task> list=taskService.createTaskQuery().taskCandidateOrAssigned("lisi").processDefinitionKey("holiday").list();
            for (Task task:list){
                System.out.println("任务名称:"+task.getName());
                System.out.println("任务执行人:"+task.getAssignee());
                System.out.println("任务ID:"+task.getId());
                System.out.println("流程实例ID:"+task.getProcessInstanceId());
    
            }
        }
     

     5. 用户进行任务处理

     
     @Test
        public void completeTask(){
            //获取ProcessEngine对象   默认配置文件名称:activiti.cfg.xml  并且configuration的Bean实例ID为processEngineConfiguration
            ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
            //获取一个TaskService对象
            TaskService taskService=processEngine.getTaskService();
            //任务处理
            taskService.complete("2505");
        }
     

    6. 当业务流程结束后通过历史可以查看到已经走完的流程

      编写测试代码

     
     //当业务流程结束后通过历史可以查看到已经走完的流程
        @Test
        public void getHistory(){
            //获取ProcessEngine对象   默认配置文件名称:activiti.cfg.xml  并且configuration的Bean实例ID为processEngineConfiguration
            ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
            //获取HistoryService接口
            HistoryService historyService = processEngine.getHistoryService();
            //获取历史任务
            HistoricActivityInstanceQuery historicActivityInstanceQuery = historyService.createHistoricActivityInstanceQuery();
            //获取指定流程实例的任务
            historicActivityInstanceQuery.processInstanceId("2501");
            //获取任务列表
            List<HistoricActivityInstance> list = historicActivityInstanceQuery.list();
            for (HistoricActivityInstance ai : list) {
                System.out.println("任务节点ID:"+ai.getActivityId());
                System.out.println("任务节点名称:"+ai.getActivityName());
                System.out.println("流程实例ID信息:"+ai.getProcessDefinitionId());
                System.out.println("流程实例ID信息:"+ai.getProcessInstanceId());
                System.out.println("==============================");
            }
        }
  • 相关阅读:
    [USACO 2012 Feb B]Moo
    [Atcoder ARC124] XOR Matching 2-小思维 | 暴力
    loj数列分块入门
    2019牛客暑期多校2-Partition problem深搜
    Codeforces 1554C
    [USACO 2012 Feb G]Cow Coupons----贪心&带悔(看完稳AC)
    Codeforces 220B-Little Elephant and Array-扫描线 & 树状数组
    [AtCoder ARC098] Donation| 建图 | 树型dp
    关于幂等性以及怎么实现幂等性
    【OOM】解决思路
  • 原文地址:https://www.cnblogs.com/danxun/p/12614657.html
Copyright © 2011-2022 走看看