Activiti工作流(第一天)

1.安装流程设计器

  1. 将activiti-designer.zip解压到myeclipse安装目录下的dropins下的activiti-designer文件夹
  2. 创建activiti.link文件,内容如下
  3. 注意:打开菜单Windows->Preferences->Activiti->Save actions, 把bpmn 和.png同步保存

    path=C:\Users\qfc\AppData\Local\MyEclipse Professional 2014\dropins\activiti-designer\

    2.Activiti介绍

    1. 工作流引擎 :ProcessEngine ,它是Activiti的核心类,由该类可以获取其他的服务实例
      (历史服务、仓库服务、任务服务、用户参与者服务)
      
    2. BPMN :UML :用例图、类图、时序图
      业务流程建模与标注(Business Process Model and Notation,BPMN) ,
      描述流程的基本符号,包括这些图元如何组合成一个业务流程图(Business Process Diagram)
    3. 数据库
      Activiti的后台是有数据库的支持,所有的表都以ACT_开头。
      第二部分是表示表的用途的两个字母标识。 用途也和服务的API对应
      Activiti的工作流数据库有23张表
      要保存流程定义

      - act_ge_*  :通用表
      
      • acthi* :历史流程相关表
      • actre* :仓库表:保存流程定义
      • actru* :保存流程运行相关的表
      • actid* :用户参与相关的表
    4. activiti.cfg.xml
      Activiti核心配置文件,配置流程引擎创建工具的基本参数和数据库连接参数

      3.HelloActiviti程序(模拟Activiti流程执行)

    5. 设置流程定义图bpmn
      assignee :代理人、指定人、处理人

    6. 创建流程引擎及工作流数据表

      数据库及表可以自动创建,

      可以在配置数据库连接时,实现自动创建数据库和表

      取得ProcessEngine对象

      先取得ProcessEngineConfiguration 对象 ,再由该对象来构建ProcessEngine

  1. 部署流程
    影响的表:

    act_re_procdef :流程定义表 :

    该表的key属性 是bpmn 的 id决定

    该表的name属性 是bpmn 的name 属性决定

    act_re_deployment:部署表 :id是由act_ge_property的 next_dbid决定

    act_ge_property :通用属性表

  2. 启动流程

  3. 查看我的个人任务

  4. 完成我的个人任务

4.代码

public class TestActiviti {
    ProcessEngine engine=ProcessEngines.getDefaultProcessEngine();

    @Test
    // 取得流程引擎,且自动创建Activiti设计的数据库及表
    public void createProcessEngine() {
        /*方法一
        // 取得ProcessEngineeConfiguration对象
        ProcessEngineConfiguration engineConfiguration = ProcessEngineConfiguration
                .createStandaloneProcessEngineConfiguration();
        // 设置数据库库连接属性
        engineConfiguration.setJdbcDriver("com.mysql.jdbc.Driver");
        engineConfiguration
                .setJdbcUrl("jdbc:mysql://localhost:3306/activitiDB?createDatabaseIfNotExist=true"
                        + "&useUnicode=true&characterEncoding=utf8");
        engineConfiguration.setJdbcUsername("root");
        engineConfiguration.setJdbcPassword("21160233099");
        // 设置创建表的策略(当没有表时,自动创建表)
        // public static final java.lang.String DB_SCHEMA_UPDATE_FALSE =
        // "false";
        // public static final java.lang.String DB_SCHEMA_UPDATE_CREATE_DROP =
        // "create-drop";
        // public static final java.lang.String DB_SCHEMA_UPDATE_TRUE = "true";
        engineConfiguration.setDatabaseSchemaUpdate("true");
        // 通过ProcessEngineConfiguration对象常见ProcessEnginee对象
        ProcessEngine processEngine = engineConfiguration.buildProcessEngine();
 */
        //方法二
            //ProcessEngineConfiguration engineConfiguration=ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml");
            //ProcessEngine engine=engineConfiguration.buildProcessEngine();
        //方法三
        ProcessEngine processEngine=ProcessEngines.getDefaultProcessEngine();//默认必须是activiti.cfg.xml方法二可以随意改名

    }
    //部署流程定义
    @Test
    public void deploy(){
        //取得流程引擎
        //获取仓库服务:管理流程定义
        RepositoryService repositoryService=engine.getRepositoryService();
        repositoryService.createDeployment()//创建一个部署的构建器
        .addClasspathResource("diagrams/LeaveBill.bpmn")//从类路径添加资源
        .addClasspathResource("diagrams/LeaveBill.png")
        .name("请假单流程")//设置部署名称
        .category("办公类别")//设置部署的类别
        .deploy();
    }
    //执行流程
    @Test
    public void startProcess(){
        String processKey="leaveBill";
        //取运行时服务
        RuntimeService runtimeService=engine.getRuntimeService();
        //取得流程实例
        ProcessInstance pi=runtimeService.startProcessInstanceByKey(processKey);//通过流程定义的key来执行流程
        System.out.println(pi.getId()+pi.getProcessDefinitionId());
    }
    //查询任务
    @Test
    public void queryTask(){
        String name="李四";
        //取得任务服务
        TaskService taskService=engine.getTaskService();
        //创建一个任务查询对象
        TaskQuery query=taskService.createTaskQuery();
        //办理人的任务列表
        List<Task> list=query.taskAssignee(name).list();
        for(Task task:list){
            System.out.println(task.getAssignee()+" "+task.getId());

        }
    }
    @Test
    //完成任务
    public void complete(){
        String taskID="204";
        engine.getTaskService().complete(taskID);


    }
}