zoukankan      html  css  js  c++  java
  • 工作流——Activiti案例

    1. 流程定义

      如何新建流程图和如何保存流程图

      1.1 在IDEA有activiti插件的基础上新建BpmnFile

            1.2 完成流程图

      

       1.3 并将每个流程编写不同名字区分 

      

       1.4 将Bpmn文件修改后缀名改为xml文件并从新打开

       1.5 右键此xml文件将他改为图

       1.6 生成一张流程图

       1.7 保存至当前Resources路径

      

     2. 流程部署 

      2.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.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
    
    复制代码

       2.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());
        }
    复制代码

      2.4 控制台效果

       2.5  数据库改变的表

     

    3. 创建流程实例

      Service总览

      

      编写测试代码 

    复制代码
    @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. 在查询zhangsan代办任务时就已经没有

    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("==============================");
            }
        }
    复制代码

      控制台效果

  • 相关阅读:
    MySQL Online DDL导致全局锁表案例分析
    .NET Core教程--给API加一个服务端缓存啦
    任务队列和异步接口的正确打开方式(.NET Core版本)
    .NET Core中使用RabbitMQ正确方式
    .NET Core单元测试之搞死开发的覆盖率统计(coverlet + ReportGenerator )
    没有执行过rm -rf /*的开发不是好运维
    dotnet core在Task中使用依赖注入的Service/EFContext
    可能是全网首个支持阿里云Elasticsearch Xapck鉴权的Skywalking
    dpdk中QSBR具体实现
    C语言二级指针底层实现
  • 原文地址:https://www.cnblogs.com/tinghao/p/12614440.html
Copyright © 2011-2022 走看看