activiti基本流程操作

这几天在学习了activiti一些基本的流程操作之后,在此记录。只有步骤,概念参考官方文档(官方文档看了半天,因为不了解Activiti Explorer所以看到一半…)

参考了网上大佬们的教程,终于摸了个门清。
http://blog.csdn.net/u011320740/article/details/53018040
http://blog.csdn.net/qiumuxia0921/article/details/50988487

前提:eclipse 、maven项目、activiti相关的一大堆jar包、eclipse activiti、mySQL

1.创建activiti.cfg.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-4.0.xsd
    http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">

    <!-- 加载配置文件 -->
    <!-- <context:property-placeholder location="classpath:jdbc.properties" />

    <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
        连接数据的配置
        <property name="jdbcDriver" value="${jdbc.driver}"></property>
        <property name="jdbcUrl" value="${jdbc.url}"></property>
        <property name="jdbcUsername" value="${jdbc.username}"></property>
        <property name="jdbcPassword" value="${jdbc.password}"></property>
        没有表创建表
        <property name="databaseSchemaUpdate" value="true"></property>
    </bean> -->
    <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
        <!-- 连接数据的配置 -->
        <property name="jdbcDriver" value="com.mysql.jdbc.Driver"></property>
        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/activiti?useUnicode=true&amp;characterEncoding=utf8"></property>
        <property name="jdbcUsername" value="root"></property>
        <property name="jdbcPassword" value="111111"></property>
        <!-- 没有表创建表 -->
        <property name="databaseSchemaUpdate" value="true"></property>
    </bean>
</beans>

备注:如果有用SSM的同学可以直接这样设置

spring-activiti.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">
    <!-- 
        ProcessEngineConfiguration processEngineConfiguration = ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration();
        //连接数据库的配置
        processEngineConfiguration.setJdbcDriver("com.mysql.jdbc.Driver");
        processEngineConfiguration.setJdbcUrl("jdbc:mysql://localhost:3306/itcast0711activiti?useUnicode=true&characterEncoding=utf8");
        processEngineConfiguration.setJdbcUsername("root");
        processEngineConfiguration.setJdbcPassword("root");

        /**
            public static final String DB_SCHEMA_UPDATE_FALSE = "false";不能自动创建表,需要表存在
            public static final String DB_SCHEMA_UPDATE_CREATE_DROP = "create-drop";先删除表再创建表
            public static final String DB_SCHEMA_UPDATE_TRUE = "true";如果表不存在,自动创建表
         */
        processEngineConfiguration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
     -->
    <bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
        <!-- 连接数据的配置 -->
        <property name="dataSource" ref="dataSource" />
        <property name="transactionManager" ref="transactionManager" />
        <!-- 没有表创建表 -->
        <property name="databaseSchemaUpdate" value="true"></property>
    </bean>

    <bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
            <property name="processEngineConfiguration" ref="processEngineConfiguration" />
    </bean>


    <bean id="repositoryService" factory-bean="processEngine" factory-method="getRepositoryService" />
    <bean id="runtimeService" factory-bean="processEngine" factory-method="getRuntimeService" />
    <bean id="taskService" factory-bean="processEngine" factory-method="getTaskService" />
    <bean id="historyService" factory-bean="processEngine" factory-method="getHistoryService" />
    <bean id="managementService" factory-bean="processEngine" factory-method="getManagementService" />

</beans>

这里直接可以设置流程引擎的数据源和事务管理器,和Spring关联起来。
之后便是设置bean,这样可以在ServiceImpl文件里直接用注解来实例化,很方便。

2.运用activiti diagram画出流程图

这里写图片描述


这里写图片描述


这里写图片描述


流程图设置如下
点击空白处设置ID
这里写图片描述


设置经理审核的处理人
这里写图片描述


这里设置的情境是,总经理有多人,任务流程一到总经理审批,总经理们都可以看到这个任务并且处理,只要一个总经理处理了,便继续下一步流程
这里写图片描述

这里设置了监听器为一个java类
代码如下

package lanqiao.activiti;

import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener;
/**
 * startProcessInstance()启动流程实例的时候,就会调用TaskListenerImpl中的notify方法,
 * 这个时候,就会指定了下一个Assignee。
 * @author 寒暄
 *
 */
public class ManagerTaskListener implements TaskListener{

    @Override
    public void notify(DelegateTask delegateTask) {
        delegateTask.addCandidateUser("a");
        delegateTask.addCandidateUser("b");
        delegateTask.addCandidateUser("c");
    }

}

这里设置了三个总经理,也就是候选人a,b,c,按道理说,接下来查询a的待办任务(这里到时候查询task的list得用taskCandidateUser(“a”))就可以看到

3.创建流程引擎、部署流程定义

创建流程引擎交给spring来创建了,创建完成之后在数据库里可以看到很多表如下这里写图片描述
所以我们需要把刚才画好的流程图部署起来
当然,没用spring的可以这么做(第一个配置activiti.cfg.xml)

//部署流程定义
    @Test
    public void CreateDeploy(){

        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        RepositoryService repositoryService = processEngine.getRepositoryService();
        //加载流程定义文件(流程图)
        repositoryService.createDeployment()
                    .addClasspathResource("diagrams/shenhe.bpmn")
                    .deploy();
        System.out.println(repositoryService.createProcessDefinitionQuery().count());
    }

这里我使用了classpathResource的方式,这样要保证和上面文件的放置一样,classpath下的diagrams文件夹里,当然,也可以用zip包装流和io流来部署流程图

部署完成之后,可以发现
这里写图片描述


这里写图片描述

这两个表都有记录了,说明部署成功

4.创建流程实例

如果说部署流程定义是公司发布请假流程的规定的话,创建流程定义就是公司的员工小汪去申请请假(实例)。

接下来看代码

@Test
    public void instanceA(){
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        RuntimeService runtimeService = processEngine.getRuntimeService();
        runtimeService.startProcessInstanceByKey("shenhe");
        Map<String, Object> map = new HashMap<String,Object>();
        map.put("manager", "经理");
        runtimeService.startProcessInstanceByKey("shenhe", map);
    }

上面的流程图里创建了一个流程变量,所以我们这里需要指定一个manager通过map传过去,查看数据库可以发现

这里写图片描述

任务列表有需要指定处理人’经理’去完成的任务了

所以接下来–

5.完成任务

这是在每个需要人为确认或操作必须进行的步骤

上一步已经到’经理’去complete任务的步骤了,好,给他个面子,完成掉

@Test
    public void complete2(){
        TaskService taskService = ProcessEngines.getDefaultProcessEngine().getTaskService();
        String taskId = "2505";
        taskService.complete(taskId);
    }

这里的2505是在没执行前面这段代码之前去数据库里task表找的,在实际的web项目中,应该从前台获取taskId传过来,这样比较实际

好了,完成之后,再看task表

这里写图片描述

经理完成了他的任务,审核通过了,到了总经理处理这项任务了。

因为总经理我们设置的是监听器,在完成经理审批之后,到,流程走到这里之前,监听器在这时执行notify里的代码,就是之前的类里设置了a,b,c三个候选人

所以我们现在去查看下比如b候选人的任务,会发现什么,代码如下:

@Test
    public void select(){
        TaskService taskService = ProcessEngines.getDefaultProcessEngine().getTaskService();
        List<Task> tasks = taskService.createTaskQuery()
                                    .taskCandidateUser("b")
                                    .list();
        for (Task task : tasks) {
            System.out.println(task);
        }
    }

console窗口显示

这里写图片描述

再看a和c也是同样的结果

接下来我们完成他

@Test
    public void complete2(){
        TaskService taskService = ProcessEngines.getDefaultProcessEngine().getTaskService();
        String taskId = "5002";
        taskService.complete(taskId);
    }

这里写图片描述

任务完成,流程实例结束

在数据库的act_hi_taskinst表和act_hi_identitylink表中可以看到(hi表示历史,没问题吧老铁?)

这里写图片描述


这里写图片描述

就此结束!

第一次自己写下整篇博客,有不足之处大佬们多多包涵,多给建议,谢啦

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值