Activiti7 基本架构与使用步骤(一)

感觉跟activiti6差不多,不过7中删除了两个service(IdentityService、FormService),反而又多了两个表。这里所有输出的信息都是以后可以放在前端里的信息。


 

1.Activiti的架构说明

ProcessEngineConfiguration类,主要作用是加载activiti.cfg.xml配置文件

ProcessEngine类 作用是帮助我们可以快速得到各个Service接口,并且可以生成activiti的工作环境 25张表生成

Service接口          作用:可以快速实现数据25张表的操作。

      RepositoryService

         RuntimeService

         TaskService

         HistoryService

 

2.用BPMN的ActivitiDesigner插件绘制流程定义图

3.部署流程定义

方式一:单个文件(bpmn文件,png文件)

/**
 * 流程定义的部署
 * 影响的activiti表有哪些
 * act_re_deployment 部署信息
 * act_re_procdef    流程定义的一些信息
 * act_ge_bytearray  流程定义的bpmn文件以及png文件
 */
public class ActivitiDeployment {
    // 流程定义部署
    public static void main(String[] args){
        //1.创建ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        //2.得到RepositoryService实例
        RepositoryService repositoryService = processEngine.getRepositoryService();

        //3.进行部署
        Deployment deployment = repositoryService.createDeployment()//创建Deployment对象
                .addClasspathResource("diagram/holiday.bpmn")//添加bpmn文件
                .addClasspathResource("diagram/holiday.png")//添加png文件
                .name("请假申请单流程")
                .deploy();//部署

        //4.输出部署的一些信息
        System.out.println(deployment.getName());
        System.out.println(deployment.getId());
    }
}

  

方式二:先将bpmn文件和png文件压缩成zip文件。但是activiti最终也是以单个文件形式保存,说明activiti进行了解压工作。

/**
 * Zip文件部署流程
 * 影响的activiti表有哪些
 *  act_re_deployment 部署信息
 *  act_re_procdef    流程定义的一些信息
 *  act_ge_bytearray  流程定义的bpmn文件以及png文件
 */
public class ActivitiZipDeployment {
    // 流程定义部署
    public static void main(String[] args){
        //1.创建ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        //2.得到RepositoryService实例
        RepositoryService repositoryService = processEngine.getRepositoryService();
        
        //3.转换出ZipInputStream流对象
        InputStream is = ActivitiZipDeployment.class.getClass().getClassLoader().getResourceAsStream("holidayBPMN.zip");

        //将InputStream流转化为ZipInputStream
        ZipInputStream zipInputStream = new ZipInputStream(is);

        //3.进行部署
        Deployment deployment = repositoryService.createDeployment()//创建Deployment对象
                .addZipInputStream(zipInputStream)
                .name("请假申请单流程")
                .deploy();//部署

        //4.输出部署的一些信息
        System.out.println(deployment.getName());
        System.out.println(deployment.getId());
    }
}

4.启动流程实例:

/**
 * 启动流程实例:
 *      前提是先已经完成流程定义的部署工作
 *
 *      背后影响的表:
 *      act_hi_actinst      已完成的活动信息
 *      act_hi_identitylink   参与者信息
 *      act_hi_procinst     流程实例
 *      act_hi_taskinst     任务实例
 *      act_ru_execution    执行表
 *      act_ru_identitylink   参与者信息
 *      act_ru_task   任务表
 */
public class ActivitiStartInstance {
    public static void main(String[] args) {
        //1.得到ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //2.得到RunService对象
        RuntimeService runtimeService = processEngine.getRuntimeService();
        //3.创建流程实例(关键步骤)即 启动流程实例
        //需要知道流程定义的Key:holiday(找key的方法  1:bpmn文件中的id,它对应的值就是key
        // 2:直接看数据库中流程定义表act_re_procdet的key值)
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("holiday");
        //4.输出实例的相关信息
        System.out.println("流程部署ID="+processInstance.getDeploymentId());//null
        System.out.println("流程定义ID="+processInstance.getProcessDefinitionId());//holiday:1:4
        System.out.println("流程实例ID="+processInstance.getId());//2501
        System.out.println("流程活动ID="+processInstance.getActivityId());//获取当前具体执行的某一个节点的ID(null)

    }
}

5.查看任务

TaskService    taskService.createTaskQuery()

/**
 * 查询当前用户的任务列表
 */
public class ActivitiTaskQuery {
    //lisi完成自己任务列表的查询
    public static void main(String[] args) {
        //1.得到ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        //2.得到TaskService对象
        TaskService taskService = processEngine.getTaskService();
        //3.根据流程定义的key以及负责人assignee来实现当前用户的任务列表查询
        List<Task> taskList = taskService.createTaskQuery()
                .processDefinitionKey("holiday")
                .taskAssignee("lisi")
                .list();//这里还有一个查询唯一结果的方法:singleResult();、还有分页查询listPage(index,limit);
        //4.任务列表展示
        for (Task task : taskList) {
            //查的act_hi_procinst表的id
            System.out.println("流程实例ID="+task.getProcessInstanceId());
            //查的act_hi_taskinst表的id
            System.out.println("任务ID="+task.getId());
            //查的act_hi_taskinst表的Assignee_
            System.out.println("任务负责人名称="+task.getAssignee());
            //查的act_hi_taskinst表的NAME_
            System.out.println("任务名称="+task.getName());
        }
    }
}

6.完成任务

TaskService    taskService.complete(task.getId());//参数为任务ID

/**
 * 处理当前用户的任务列表
 *  背后操作到的表:
 *           act_hi_actinst
 *           act_hi_identitylink
 *           act_hi_taskinst
 *           act_ru_execution
 *           act_ru_identitylink
 *           act_ru_task //只放当前要执行的任务
 */
public class ActivitiCompleteTask {
    /**
     * 李四完成自己的任务
     * @param args
     */
    public static void main(String[] args) {
        //1.得到ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

        //2.得到TaskService对象
        TaskService taskService = processEngine.getTaskService();

        //3.处理任务,结合当前用户任务列表的查询操作的话,可以知道任务ID=5002(实际操作中应该与查询写在一起)
        taskService.complete("5002");
    }
}

 

posted @ 2019-05-22 10:50  X凯  阅读(17477)  评论(0编辑  收藏  举报