Activiti工作流基础学习笔记

一、了解工作流

工作流(Workflow),就是“业务过程的部分或整体在计算机应用环境下的自动化”,它主要解决的是“使在多个参与者之间按照某种预定义的规则传递文档、信息或任务的过程自动进行,从而实现某个预期的业务目标,或者促使此目标的实现”。
工作流管理系统(Workflow Management System, WfMS)是一个软件系统,它完成工作量的定义和管理,并按照在系统中预先定义好的工作流逻辑进行工作流实例的执行。工作流管理系统不是企业的业务系统,而是为企业的业务系统的运行提供了一个软件的支撑环境。

常见的工作流框架
Activity5.13、JBPM4.4、OSWorkFlow、WorkFlow
工作流框架底层需要有数据库提供支持,activiti5.13版本,有23张表。JBPM4.4框架底层有数据库支持,18张表。JBPM底层使用hibernate操作数据库。Activiti框架底层使用的mybatis操作数据库。

二、初始化表结构

1.使用Activiti框架提供的建表语句

下载的Activiti框架的包中 /activiti-x.xx/database/ceate/ 目录中提供各种数据库的建表语句。

2.使用Activiti框架自动建表

2.1 不使用配置文件
    @Test
    public void test1() {
        //    创建一个流程引擎配置对象
        ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration();

        //    设置数据源信息
        configuration.setJdbcDriver("com.mysql.jdbc.Driver");
        configuration.setJdbcUrl("jdbc:mysql://localhost:3306/activiti");
        configuration.setJdbcUsername("root");
        configuration.setJdbcPassword("");

        //    设置自动建表
        configuration.setDatabaseSchemaUpdate("true");

        //    创建一个流程引擎对象,在创建流程引擎对象中会自动建表
        ProcessEngine processEngine = configuration.buildProcessEngine();
    }
2.2 使用自定义配置文件

actitviti-context.xml (名字随意)

    <!-- 配置流程引擎配置对象 -->
    <bean id="processEngineConfiguration"
        class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
        <property name="jdbcDriver" value="com.mysql.jdbc.Driver" />
        <property name="jdbcUrl" value="jdbc:mysql:///activiti" />
        <property name="jdbcUsername" value="root" />
        <property name="jdbcPassword" value="" />
        <property name="databaseSchemaUpdate" value="true" />
    </bean>

Test.java

    @Test
    /**
     * 使用框架提供的自动建表(提供配置文件)
     */
    public void test2() {
        String resource = "actitviti-context.xml";//配置文件名称
        String beanName = "processEngineConfiguration";//配置id值
        //加载配置文件
        ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(resource, beanName);
       //创建流程引擎对象
        ProcessEngine processEngine = configuration.buildProcessEngine();
    }
3.3 使用Activiti框架提供的默认配置文件

要求配置文件名称必须为activiti-context.xml或者activiti.cfg.xml。

配置流程引擎配置对象的id必须为 processEngineConfiguration
创建流程引擎对象的id必须为processEngine
activiti-context.xml

    <!-- 配置流程引擎配置对象 -->
    <bean id="processEngineConfiguration"
        class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
        <property name="jdbcDriver" value="com.mysql.jdbc.Driver" />
        <property name="jdbcUrl" value="jdbc:mysql:///activiti" />
        <!--<property name="jdbcUrl" value="jdbc:mysql:///activiti_web" />-->
        <property name="jdbcUsername" value="root" />
        <property name="jdbcPassword" value="" />
        <property name="databaseSchemaUpdate" value="true" />
    </bean>

    <!-- 配置一个流程引擎工厂bean,用于创建流程引擎对象 -->
    <bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
        <!-- 通过set方法注入流程引擎配置对象 -->
        <property name="processEngineConfiguration" ref="processEngineConfiguration" />
    </bean>

Test.java

    @Test
    /**
     * 使用框架提供的自动建表(使用默认配置文件)
     */
    public void test() {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    }

三、了解Activiti框架中的二十三张表

Activiti的后台是有数据库的支持,所有的表都以ACT_开头。 第二部分是表示表的用途的两个字母标识。 用途也和服务的API对应。

  1. ACT_RE_*: 'RE'表示repository。 这个前缀的表包含了流程定义和流程静态资源 (图片,规则,等等)。
  2. ACT_RU_*: 'RU'表示runtime。 这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据。 Activiti只在流程实例执行过程中保存这些数据, 在流程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快。
  3. ACT_ID_*: 'ID'表示identity。 这些表包含身份信息,比如用户,组等等。
  4. ACT_HI_*: 'HI'表示history。 这些表包含历史数据,比如历史流程实例, 变量,任务等等。
  5. ACT_GE_*: 通用数据, 用于不同场景下。

四、Activiti框架的基本使用

1.部署流程定义

1.1 使用Eclipse或Idea的BPMN编辑插件绘制流程图,并导出 流程图.bpmn流程图.png。(插件的安装及使用自行百度)

2.2 使用Java代码部署流程流程定义
Test.java

    @Test
    /**
     * 部署流程定义
     * 操作的数据表:
     *      act_re_deloyment(部署表) 部署一次 插入一条记录
     *      act_re_procdef 可以认为是部署表的扩展表 流程定义表
     *      act_ge_bytearray:流程定义文件被序列化存在数据表中
     */
    public void test() {
        //使用默认配置文件创建流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        // 获得一个部署构建器对象,用于加载流程定义文件(test.bpmn test.png)完成流程定义的部署
        DeploymentBuilder builder = processEngine.getRepositoryService().createDeployment();
        //   加载流程定义文件
        builder.addClasspathResource("/process/test.bpmn");
        builder.addClasspathResource("/process/test.png");
        //    部署流程定义
        Deployment deployment = builder.deploy();
    }

2. 查询流程定义列表

    /**
     * 查询流程定义列表
     */
    @Test
    public void test() {
        //使用默认配置文件创建流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //    流程定义查询对象,用于查询act_re_procdef
        ProcessDefinitionQuery query = processEngine.getRepositoryService().createProcessDefinitionQuery();
        //添加过滤条件
        query.processDefinitionKey("myProcess_1");
        //    添加排序条件
        query.orderByProcessDefinitionVersion().desc();
        //添加分页查询
        query.listPage(0, 10);
        List<ProcessDefinition> list = query.list();
        for (ProcessDefinition pd : list) {
            System.out.println(pd.getId());
        }
    }

3.启动流程实例

流程实例是根据一个流程定义具体的一次执行过程就是一个流程实例,一个流程定义对应多个流程实例(一对多关系)。

    /**
     * 根据流程定义 启动一个流程实例
     * 根据流程定义的一次具体执行过程,就是一个流程实例
     */
    @Test
    public void test() {
        //使用默认配置文件创建流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        String processDefinitionId = "myProcess_1:7:1004";//流程定义id可在act_re_procdef表中查询到
        ProcessInstance processInstance = processEngine.getRuntimeService().startProcessInstanceById(processDefinitionId);
        System.out.println(processInstance.getId());
    }

4.查询个人任务列表

    /**
     * 查询个人任务列表
     */
    @Test
    public void test() {
        //使用默认配置文件创建流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //创建任务查询
        TaskQuery taskQuery = processEngine.getTaskService().createTaskQuery();
      //添加查询条件 办理人为王五
        String assignee = "王五";
        taskQuery.taskAssignee(assignee);
        List<Task> list = taskQuery.list();//查询所有
        for (Task task : list) {
            System.out.println(task.getId() + "——" + task.getName());
        }
    }

5.办理任务

    /**
     * 办理业务
     */
    @Test
    public void test() {
        //使用默认配置文件创建流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        String taskId = "602";//任务id可在act_ru_task表中查询到
        processEngine.getTaskService().complete(taskId);//传入任务id办理业务
        System.out.println("办理成功");
    }

五、Activiti提供的Service对象

在以上的代码中有很多Servie,接下来说明一下这些Service的区别。

RepositoryService----操作静态的资源(流程定义,bpmn、png)
RuntimeService-----操作流程实例(启动流程实例、查询流程实例、结束流程实例)
TaskService-----操作任务(查询任务、办理任务)
HistoryService----操作历史数据

六、Activiti框架提供的对象(和表有对应关系)

Deployment-----act_re_deployment
ProcessDefinition----act_re_procdef
ProcessInstance-----act_ru_execution
Task-----act_ru_task

七、使用Activiti框架提供的网页版流程设计器

1.将Activiti的包中activiti-explorer.war复制到tomcat的/webapps目录中。
2.启动Tomcat,访问 http://lcoalhost:8080/activiti-explorer
3.登录。登录账号和密码为:kermit

八、使用Activiti框架的API操作流程

1.部署流程定义的两种方法

1.1 读取单个的流程定义文件

    @Test
    public void test() {
        //使用默认配置文件创建流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //创建流程部署对象
        DeploymentBuilder deploymentBuilder = processEngine.getRepositoryService().createDeployment();

        //读取单个的流程定义文件
        deploymentBuilder.addClasspathResource("/process/test.bpmn");
        deploymentBuilder.addClasspathResource("/process/test.png");
        Deployment deployment = deploymentBuilder.deploy();//部署流程

1.2 读取ZIP压缩文件
将test.bpmn和test.png放到同一个zip压缩包中。

    @Test
    public void test() {
        //使用默认配置文件创建流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //创建流程部署对象
        DeploymentBuilder deploymentBuilder = processEngine.getRepositoryService().createDeployment();

        //读取ZIP压缩文件
        //读取资源文件
        ZipInputStream zipInputStream = new ZipInputStream(this.getClass().getClassLoader().getResourceAsStream("/process/process.zip"));
        deploymentBuilder.addZipInputStream(zipInputStream);
        deploymentBuilder.name("请假流程部署");//设置流程定义名称
        Deployment deployment1 = deploymentBuilder.deploy();//部署流程
    }

2.查询流程部署列表 (act_re_deployment表)

    @Test
    public void test() {
        //使用默认配置文件创建流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //部署查询对象,查询act_re_deployment 部署表
        DeploymentQuery deploymentQuery = processEngine.getRepositoryService().createDeploymentQuery();
        List<Deployment> list = deploymentQuery.list();
        for (Deployment deployment : list) {
            String id = deployment.getId();
            System.out.println(id);
        }
    }

3.删除部署信息

    @Test
    public void test() {
        //使用默认配置文件创建流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        String deloymentId = "7504"; //流程部署id  在act_re_deployment表中
        //deleteDeployment有两个参数 第一个删除 部署的内容的id,第二个是否级联删除,默认为false
        processEngine.getRepositoryService().deleteDeployment(deloymentId, true);
    }

4.删除流程定义(通过删除部署信息达到删除流程定义的目的)

    @Test
    public void test() {
        //使用默认配置文件创建流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        String deloymentId = "1001";
        //deleteDeployment有两个参数 第一个删除 部署的内容的id,第二个是否级联删除,默认为false
        processEngine.getRepositoryService().deleteDeployment(deloymentId, true);
    }

5.查询流程定义列表

    @Test
    public void test() {
        //使用默认配置文件创建流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //流程定义查询对象,查询表act_re_procdef
        ProcessDefinitionQuery processDefinitionQuery = processEngine.getRepositoryService().createProcessDefinitionQuery();
        List<ProcessDefinition> list = processDefinitionQuery.list();
        for (ProcessDefinition pd : list) {
            System.out.println(pd.getName() + "———" + pd.getId());
        }
    }

6.查询一次部署对应的流程定义文件和对应的输入流(bpmn,png)

 @Test
    public void test() throws IOException {
        //使用默认配置文件创建流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        String deploymentId = "901";
        List<String> list = processEngine.getRepositoryService().getDeploymentResourceNames(deploymentId);
        for (String name : list) {
            System.out.println(name);
            InputStream inputStream = processEngine.getRepositoryService().getResourceAsStream(deploymentId, name);
            //将文件保存到本地磁盘
         org.apache.commons.io.FileUtils.copyInputStreamToFile(inputStream, new File("d:\\" + name));
            inputStream.close();
        }
    }

7.获得png文件的输入流

    @Test
    public void test() throws IOException {
        //使用默认配置文件创建流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        String processDefinitionId = "myProcess_1:6:904";
        InputStream PngInputStream = processEngine.getRepositoryService().getProcessDiagram(processDefinitionId);
        FileUtils.copyInputStreamToFile(PngInputStream, new File("d:\\my.png"));
    }

8.启动流程实例的两种方法

8.1 方式一:根据流程定义的id启动

@Test
    public void test() {
        //使用默认配置文件创建流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //方式一:根据流程定义的id启动
       String processDefinitionId = "myProcess_1:6:904";
        ProcessInstance processInstance = processEngine.getRuntimeService().startProcessInstanceById(processDefinitionId);
        System.out.println(processInstance.getId());
}

8.2 方式二:根据流程定义的key启动(自动选择最新版本的流程定义启动流程实例)

    @Test
    public void test() {
        //使用默认配置文件创建流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //方式二:根据流程定义的key启动(自动选择最新版本的流程定义启动流程实例)
        String processDefinitionKey = "myProcess_1";
        ProcessInstance processInstance = processEngine.getRuntimeService().startProcessInstanceByKey(processDefinitionKey);
        System.out.println(processInstance.getId());
    }

9.查询流程实例列表,查询act_ru_execution表

    @Test
    public void test() {
        //使用默认配置文件创建流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //流程实例查询对象,查询act_ru_execution表
        ProcessInstanceQuery query = processEngine.getRuntimeService().createProcessInstanceQuery();
        query.processDefinitionKey("myProcess_1");
        query.orderByProcessDefinitionId().desc();
        query.listPage(0, 3);
        List<ProcessInstance> list = query.list();
        for (ProcessInstance pi : list) {
            System.out.println(pi.getId() + "--" + pi.getActivityId());
        }
    }

10.结束流程实例

操作的表:act_re_excution,act_ru_task

    @Test
    public void test() {
        //使用默认配置文件创建流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        String processInstanceId = "1601";
        processEngine.getRuntimeService().deleteProcessInstance(processInstanceId, "不想要了");
    }

11.查询任务列表

    @Test
    public void test() {
        //使用默认配置文件创建流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //任务查询对象,查询任务表 act_ru_task表
        TaskQuery query = processEngine.getTaskService().createTaskQuery();
        //按照办理人进行过滤
        String assignee = "李四";
        query.taskAssignee(assignee);
        query.orderByTaskCreateTime().desc();
        List<Task> list = query.list();
        for (Task task : list) {
            System.out.println(task.getId());
        }
    }

12.办理任务

    @Test
    public void test() {
        //使用默认配置文件创建流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        String taskId = "1404";
        processEngine.getTaskService().complete(taskId);
    }

13.直接将流程向下执行一步

    @Test
    public void test() {
        //使用默认配置文件创建流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        String executionId = "1401"; //流程实例id
        processEngine.getRuntimeService().signal(executionId);
    }

14.查询最新版本的流程定义列表

    @Test
    public void test() {
        //使用默认配置文件创建流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        ProcessDefinitionQuery query = processEngine.getRepositoryService().createProcessDefinitionQuery();
        query.orderByProcessDefinitionVersion().asc();
        List<ProcessDefinition> list = query.list();
        Map<String, ProcessDefinition> map = new HashMap<>();
        for (ProcessDefinition pd : list) {
            map.put(pd.getKey(),pd);
        }
        System.out.println(map);
    }

15.流程的修改

流程的修改:添加新的流程版本,如果已经在执行的流程,按照原来的流程继续执行。新的流程按照最新版本进行执行。

16.历史数据查询

16.1 查询历史流程实例列表
查询历史流程实例列表 act_hi_procinst

    @Test
    public void test() {
        //使用默认配置文件创建流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        HistoricProcessInstanceQuery query = processEngine.getHistoryService().createHistoricProcessInstanceQuery();
        List<HistoricProcessInstance> list = query.list();
        for (HistoricProcessInstance hi : list) {
            System.out.println(hi.getId());
        }
    }

16.2 查询历史活动数据
查询历史活动数据 act_hi_actinst 包括任务和事件

    @Test
    public void test() {
        //使用默认配置文件创建流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        HistoricActivityInstanceQuery query = processEngine.getHistoryService().createHistoricActivityInstanceQuery();
        //按照流程实例排序
        query.orderByProcessInstanceId().desc();
        query.orderByHistoricActivityInstanceEndTime().asc();
        List<HistoricActivityInstance> list = query.list();
        for (HistoricActivityInstance hi : list) {
            System.out.println(hi.getActivityId() + "——" + hi.getActivityName() + "——" + hi.getActivityType());
        }
    }

16.3 查询历史任务数据
查询历史任务数据 act_hi_taskinst 单纯的只有任务

    @Test
    public void test() {
        //使用默认配置文件创建流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        HistoricTaskInstanceQuery query = processEngine.getHistoryService().createHistoricTaskInstanceQuery();
        query.orderByProcessInstanceId().asc();
        query.orderByHistoricTaskInstanceEndTime().asc();
        List<HistoricTaskInstance> list = query.list();
        for (HistoricTaskInstance hi:list){
            System.out.println(hi.getAssignee()+"——"+hi.getName()+"——"+hi.getStartTime());
        }
    }

九、流程变量

在流程执行或者任务执行的过程中,用于设置和获取变量,使用流程变量在流程传递的过程中传递业务参数。

对应的表:
act_ru_variable:正在执行的流程变量表
act_hi_varinst:流程变量历史表


流程变量图解

流程变量.png

1.设置流程变量

1.1 在启动流程实例时设置

    @Test
    public void test() {
        //使用默认配置文件创建流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        String processDefinitionKey = "variable";
        Map<String, Object> variables = new HashMap<>();
        variables.put("key1", "value1");
        variables.put("key2", 200);
        ProcessInstance processInstance = processEngine.getRuntimeService().startProcessInstanceByKey(processDefinitionKey, variables);
        System.out.println(processInstance.getId());
    }

1.2 在办理任务时设置流程变量

    @Test
    public void test() {
        //使用默认配置文件创建流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        String taskId = "1206";
        Map<String, Object> variables = new HashMap<>();
        variables.put("user", new User(1, "小王"));
        processEngine.getTaskService().complete(taskId, variables);
    }

1.3 使用RuntimeService的方法设置

    @Test
    public void test() {
        //使用默认配置文件创建流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        String excutionId = "601";//流程实例Id
        String variableName = "key3";
        String value = "value3";
        processEngine.getRuntimeService().setVariable(excutionId, variableName, value);
    }

1.4 使用TaskService的方法设置

    @Test
    public void test() {
        //使用默认配置文件创建流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        String taskId = "704";
        Map<String, Object> variables = new HashMap<>();
        variables.put("key4", 400);
        variables.put("k5", "v5");
        processEngine.getTaskService().setVariables(taskId, variables);
    }


2.流程变量支持的类型

Jdk中提供的数据类型(String、Integer、List 、Map…)
自定义的实体类(要求实现序列化接口),在variable表中只存bytearray_id 实例化内容存在bytearray表中。

3.获取流程变量

3.1 使用RuntimeService的方法获取

    @Test
    public void test() {
        //使用默认配置文件创建流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        String executionId = "1201";
        Map<String, Object> variables = processEngine.getRuntimeService().getVariables(executionId);
        System.out.println(variables);
        Set<String> set = variables.keySet();//key2 key1 user
        for (String key : set) {
            Object val = variables.get(key);
            System.out.println(key + "=" + val);
        }

        //根据一个key获得一个value
        Object value = processEngine.getRuntimeService().getVariable(executionId, "user");
        System.out.println(value);

        Collection<String> variableNames = new ArrayList<>();
        variableNames.add("key2");
        variableNames.add("user");
        Map<String, Object> map = processEngine.getRuntimeService().getVariables(executionId, variableNames);
        System.out.println(map);

3.2 使用TaskService的方法获取

    @Test
    public void test() {
        //使用默认配置文件创建流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        String taskId = "1305";
        Map<String, Object> variables = processEngine.getTaskService().getVariables(taskId);
    }


十、任务的类型

1.个人任务

由某一个负责办理,在任务表中通过assignee字段记录。

2.公共任务(组任务)

当前的任务可以由多个人其中的某一个人办理, 可以在设计流程图时指定多个办理人。Candidate Users 候选用户


公共任务图示.png

2.1 查询公共任务列表

    @Test
    public void test() {
        //使用默认配置文件创建流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        TaskQuery query = processEngine.getTaskService().createTaskQuery();
        //    根据候选人过滤
        String candidateUser = "李四";
        query.taskCandidateUser(candidateUser);
        List<Task> list = query.list();
        for (Task task:list){
            System.out.println(task.getName());
        }
    }

2.2 拾取公共任务(将公共任务变为个人任务)

    @Test
    public void test(){
        //使用默认配置文件创建流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        String taskId="1602";
        String userId="王五";
        processEngine.getTaskService().claim(taskId,userId);
    }

2.3 退回任务(将个人任务重新变为公共任务)

    @Test
    public void test(){
        //使用默认配置文件创建流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        String taskId="1602";
        processEngine.getTaskService().setAssignee(taskId,null);
    }


3.接受任务

接收任务不是由某个人负责办理,通过signal方法让流程执行的
接收任务图示.png
    /**
     * 处理接收任务
     */
    @Test
    public void test() {
        //使用默认配置文件创建流程引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        String excutionId = "2501";
        processEngine.getRuntimeService().signal(excutionId);
    }


十一、监听器(Listener)

1.执行监听器

监听流程实例的事件

第一步:按照框架的规则编写监听器类

import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.ExecutionListener;

/**
 * @author Hiseico
 * @create 2018-06-07 16:41
 * @desc 自定义执行监听器
 **/
public class MyExcutionListener implements ExecutionListener {
    //当监听事件发生时执行此方法
    @Override
    public void notify(DelegateExecution delegateExecution) throws Exception {
        System.out.println("自定义的监听器执行。。。2");
    }
}

第二步:设计流程图,注册监听器类


执行监听器设置图示.png

第三步:启动流程实例,Activiti框架通过反射调用监听器类

2.任务监听器

监听任务事件

第一步:按照activiti框架的规则编写一个任务监听器类

import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener;

import java.util.Set;

/**
 * @author Hiseico
 * @create 2018-06-07 17:10
 * @desc 自定义任务监听器
 **/
public class MyTaskListener implements TaskListener {
    /**
     * 监听任务事件
     *
     * @param delegateTask
     */
    @Override
    public void notify(DelegateTask delegateTask) {
        //任务办理人
        String assignee = delegateTask.getAssignee();
        //任务名称
        String eventName = delegateTask.getEventName();
        //事件名称
        String name = delegateTask.getName();
        //流程实例Id
        String processInstanceId = delegateTask.getProcessInstanceId();
        //获取当前流程实例范围内的所有流程变量的名字
        Set<String> variableNames = delegateTask.getVariableNames();
        for (String key : variableNames) {
            Object value = delegateTask.getVariable(key);
            System.out.println(key + " = " + value);
        }
        System.out.println("一个["+name+"]任务被创建了,由["+assignee+"]负责办理");
    }
}

第二步:注册监听类


注册任务监听器图示.png

第三步:办理任务,由框架通过反射调用监听器类

十二、网关

1.排他网关(ExclusiveGateway)

用来在流程中实现决策。当流程执行到排他网关,所有数据就会被执行一遍,满足条件的就会让流程继续运行。需要注意的是:排他网关只会选择一条满足条件的执行。

第一步:设计流程图,使用排他网关


设置排他网关图示.png

第二步:执行流程,由框架根据设置的流程变量选择执行其中的一个分支,在分支的线上设置参数:Condition:#{bxje>200}

第三步:办理业务

    /**
     * 办理任务,设置流程变量
     */
    @Test
    public void test() {
        String taskId = "802";
        Map<String, Object> variables = new HashMap<>();
        variables.put("bxje",600);//排他网关会自动判断 bxje 变量的值,选择执行分支
        processEngine.getTaskService().complete(taskId,variables);
    }


2.并行网关(ParallelGateway)

它允许将流程分成多条分支,也可以把多条分支汇聚成一条。

分支:经过并行网关的所有流,都会并行执行

汇聚:等所有流都到达并行网关之后,流程才会通过并行网关。

并行网关,没有条件判断。流程通过网关之后,有几条分支,就会有几个执行对象同时执行。需要注意的是:并行网关一定是成对出现的,有分支也有汇聚。

并行网关图示.png


十三、Spring整合Activiti

第一步:提供spring配置文件,配置数据源、事务管理器、流程引擎配置对象、流程引擎对象
appplicationContext.xml

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                        http://www.springframework.org/schema/beans/spring-beans.xsd
                        http://www.springframework.org/schema/context 
                        http://www.springframework.org/schema/context/spring-context-2.5.xsd
                        http://www.springframework.org/schema/tx 
                        http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
    <!--配置数据源-->
    <bean id="ds" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql:///activiti"/>
        <property name="username" value="root"/>
        <property name="password" value=""/>
    </bean>

    <!--事务管理器-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="ds"/>
    </bean>

    <!--配置一个Spring提供的对象,用于创建一个流程引擎配置对象-->
    <bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
        <property name="transactionManager" ref="transactionManager"/>
        <property name="dataSource" ref="ds"/>
        <!--自动建表的配置-->
        <property name="databaseSchemaUpdate" value="true"/>
    </bean>

    <!--创建流程引擎对象-->
    <bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
        <property name="processEngineConfiguration" ref="processEngineConfiguration"/>
    </bean>
</beans>

第二步:在Java程序中读取spring配置文件,创建spring工厂,获取流程引擎对象

public class SpringActivitiTest {
    @Test
    public void test() {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring/applicationContext.xml");
       ProcessEngine processEngine = (ProcessEngine) applicationContext.getBean("processEngine");
        DeploymentBuilder deploymentBuilder = processEngine.getRepositoryService().createDeployment();
        deploymentBuilder.addClasspathResource("spring/variable.bpmn");
        Deployment deployment = deploymentBuilder.deploy();
    }
}





到此Activiti框架的基础笔记就先整理到这里,本笔记用作学习完Activiti框架后复习使用,不适用于Activiti框架入门教程,不喜勿喷。

转载请注明出处及作者。

Create By Hiseico

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容