[工作流activiti]-01.基础篇

来源:互联网 发布:有网络但是网页打不开 编辑:程序博客网 时间:2024/05/24 03:48

一、activiti发展史

链接:http://blog.csdn.net/hj7jay/article/details/68483096

二、activiti表

==注==:工作流框架底层有数据库支持,根据版本不同,表个数也不同。5.13版本对应23张表,5.16版本对应24张表,5.22版本对应25张表。JBPM4.4框架底层也有数据库支持,18张表。Activiti框架底层使用mybatis操作数据库,JBPM框架底层使用hibernate操作数据库。

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

1. 资源库流程规则表(ACT_RE_*)

ACT_RE_*: ‘RE’表示repository。 这个前缀的表包含了流程定义和流程静态资源 (图片,规则,等等)

ACT_RE_DEPLOYMENT   #流程部署信息表ACT_RE_MODEL        #流程设计模型部署表ACT_RE_PROCDEF      #流程定义表
2. 运行时数据库表(ACT_RU_*)

ACT_RU_*: ‘RU’表示runtime。 这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据。 Activiti只在流程实例执行过程中保存这些数据, 在流程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快。

ACT_RU_EVENT_SUBSCR #ACT_RU_EXECUTION    #运行时流程执行实例表ACT_RU_IDENTITYLINK #运行时流程人员表,主要存储任务节点与参与者的相关信息ACT_RU_JOB          #ACT_RU_TASK         #运行时任务节点表ACT_RU_VARIABLE     #运行时流程变量数据表
3. ACT_ID_*: ‘ID’表示identity。 这些表包含身份信息,比如用户,组等等。
ACT_ID_GROUP        #用户组信息表ACT_ID_INFO         #用户扩展信息表ACT_ID_MEMBERSHIP   #用户与用户组对应信息表ACT_ID_USER         #用户信息表
4. 历史数据库表(ACT_HI_*)

ACT_HI_*: ‘HI’表示history。 这些表包含历史数据,比如历史流程实例, 变量,任务等等。

ACT_HI_ACTINST      #历史节点表ACT_HI_ATTACHMENT   #历史附件表ACT_HI_COMMENT      #历史意见表ACT_HI_DETAIL       #历史详情表,提供历史变量的查询ACT_HI_IDENTITYLINK #历史流程人员表ACT_HI_PROCINST     #历史流程实例表ACT_HI_TASKINST     #历史任务实例表ACT_HI_VARINST      #历史变量表
5. 通用数据表(ACT_GE_*)

ACT_GE_*: 通用数据, 用于不同场景下。

ACT_GE_BYTEARRAY # 二进制数据表ACT_GE_PROPERTY #属性数据表存储整个流程引擎级别的数据,初始化表结构时,会默认插入三条记录
6. 其他
ACT_EVT_LOGACT_PROCDEF_INFO

三、入门程序

1.单独使用activiti

1. 创建一个Java项目,导入jar包
2. 在config目录下提供配置文件activiti-context.xml或者activiti.cfg.xml
<beans xmlns="http://www.springframework.org/schema/beans"       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">    <!-- 配置Activiti框架的流程引擎配置对象 -->    <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="root"/>        <!-- 配置自动建表 -->        <property name="databaseSchemaUpdate" value="true"/>    </bean>    <!-- 配置流程引擎工厂bean,用于创建一个流程引擎对象 -->    <bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">        <!-- 注入上面的配置对象 -->        <property name="processEngineConfiguration" ref="processEngineConfiguration"/>    </bean></beans>
3. 调用Activiti的API,创建一个流程引擎对象,这个过程中会完成自动建表(运行test方法即可)
public class HelloWorld {    /**     * 使用activiti框架自动建表方式自动创建表     */    @Test    public void test1() {        ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();    }}

2.与spring结合

<bean id="writeDataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">    ......</bean><!--注册事务管理器-->    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">        <property name="dataSource" ref="dataSource"/>    </bean>    <!-- 配置Activiti框架的流程引擎配置对象 -->    <bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">        <property name="dataSource" ref="dataSource"/>        <property name="transactionManager" ref="transactionManager"/>        <!-- 配置自动建表 -->        <property name="databaseSchemaUpdate" value="false"/>    </bean>    <!-- 配置流程引擎工厂bean,用于创建一个流程引擎对象 -->    <bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">        <!-- 注入上面的配置对象 -->        <property name="processEngineConfiguration" ref="processEngineConfiguration"/>    </bean>    <!--创建activiti框架的Service对象 repositoryService、identityService、runtimeService、taskService-->    <bean id="repositoryService" factory-bean="processEngine" factory-method="getRepositoryService"/>    <bean id="identityService" factory-bean="processEngine" factory-method="getIdentityService"/>    <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"/>

四、基础API使用

5.16中文api:http://www.mossle.com/docs/activiti/index.html#bpmnSequenceFlow

部署流程定义

/** * 部署流程定义,框架操作表:act_re_deployment(部署表)、act_re_procdef(流程定义表)、act_ge_bytearray(二进制表) */@Testpublic void test2() {    //读取默认配置文件,创建一个流程引擎对象    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();    //创建一个部署构建器对象    DeploymentBuilder deploymentBuilder = processEngine.getRepositoryService().createDeployment();    //加载流程定义文件    deploymentBuilder.addClasspathResource("process/qjlc.bpmn");    Deployment deploy = deploymentBuilder.deploy();//多个数据库操作    System.out.println(deploy);}

查询流程定义

/** * 查询流程定义 */@Testpublic void test3() {    //流程定义查询对象,通过这个对象可以查询act_re_procdef表    ProcessDefinitionQuery query = processEngine.getRepositoryService().createProcessDefinitionQuery();    //添加过滤条件    query.processDefinitionName("请假流程");    //添加排序条件    query.orderByProcessDefinitionVersion().asc();    //添加分页条件    List<ProcessDefinition> list = query.listPage(0, 10);    for (ProcessDefinition processDefinition : list) {        System.out.println(processDefinition.getId());    }}

启动流程实例

根据某个规则(流程定义)具体一次执行过程就是一个流程实例。流程定义和流程实例是一对多关系

/** * 根据流程定义启动流程实例,操作的表act_ru_execution(流程实例表)、act_ru_task(任务表) */@Testpublic void test4() {    String processDefinitionId = "myProcess_qjlc:1:2504";//流程定义id    ProcessInstance processInstance = processEngine.getRuntimeService().            startProcessInstanceById(processDefinitionId);    System.out.println(processInstance.getId());}

查询流程实例

/** * 查询流程实例 */@Testpublic void test5() {    ProcessInstanceQuery query = processEngine.getRuntimeService().createProcessInstanceQuery();    List<ProcessInstance> list = query.list();    for (ProcessInstance processInstance : list) {        System.out.println(processInstance);    }}

升级篇

部署流程定义两种方式

/**    * 部署流程定义两种方式    * 1.加载单个流程定义文件    * 2.加载zip文件    */@Testpublic void test1() throws FileNotFoundException {    //创建一个部署构造器对象    DeploymentBuilder deploymentBuilder = processEngine.getRepositoryService().createDeployment();    /* 方式一:加载单个流程定义文件 */    // deploymentBuilder.addClasspathResource("process/bxlc.bpmn");    /* 方式二:加载zip文件 */    //ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(//                new File("/Users/bob/Applications/bob-workspace/github/stu-activiti/stu-activiti5/src/main/resources/process/lc.zip")));    ZipInputStream zipInputStream = new ZipInputStream(this.getClass().getClassLoader().getResourceAsStream("process/lc.zip"));    deploymentBuilder.addZipInputStream(zipInputStream);    Deployment deployment = deploymentBuilder.deploy();//部署流程定义    System.out.println(deployment);}

查询流程定义(最新版本的流程定义)

/**    * 查询流程定义(最新版本的流程定义)    */@Testpublic void test2() throws FileNotFoundException {    //流程定义查询对象    ProcessDefinitionQuery query = processEngine.getRepositoryService().createProcessDefinitionQuery();    //方式一:添加过滤条件---最新版本的流程定义//        query.latestVersion();    //方式二:自定义实现    query.orderByProcessDefinitionVersion().asc();    List<ProcessDefinition> list = query.list();    HashMap<String, ProcessDefinition> map = new HashMap<String, ProcessDefinition>();    for (ProcessDefinition processDefinition : list) {        map.put(processDefinition.getKey(), processDefinition);    }    list = new ArrayList<ProcessDefinition>(map.values());    for (ProcessDefinition processDefinition : list) {        System.out.println(processDefinition);    }    // 在Activiti框架中,提供了很多查询对象,可以查询对应的表    processEngine.getRepositoryService().createDeploymentQuery().list();//act_re_deployment    processEngine.getRepositoryService().createProcessDefinitionQuery().list();//act_re_procdef    processEngine.getRuntimeService().createProcessInstanceQuery().list();//act_ru_execution    processEngine.getTaskService().createTaskQuery().list();//act_ru_task    processEngine.getHistoryService().createHistoricActivityInstanceQuery().list();//act_hi_actinst}

删除流程定义

/**    * 删除流程定义    */@Testpublic void test3() {    //页面可以传递流程定义id参数    String processDefinitionId = "myProcess_qjlc:1:2504";    //根据流程定义id查询流程定义对象    ProcessDefinition processDefinition = processEngine.getRepositoryService().createProcessDefinitionQuery().processDefinitionId(processDefinitionId).singleResult();    //根据流畅定义对象获取流程部署id    String deploymentId = processDefinition.getDeploymentId();//部署id(即act_re_deployment的id)    processEngine.getRepositoryService().deleteDeployment(deploymentId);    //级联删除,不管是否有流程定义是否正在使用(不建议使用)    //processEngine.getRepositoryService().deleteDeployment(deploymentId, true);}

查询流程定义对应的流程定义文件名称和输入流

/**    * 查询流程定义对应的流程定义文件名称和输入流    */@Testpublic void test4() throws IOException {    String deploymentId = "17501";//部署id    List<String> names = processEngine.getRepositoryService().getDeploymentResourceNames(deploymentId);    for (String name : names) {        System.out.println(name);        InputStream inputStream = processEngine.getRepositoryService().getResourceAsStream(deploymentId, name);        FileUtils.copyInputStreamToFile(inputStream, new File("/Users/bob/Applications/bob-workspace/github/" +                "stu-activiti/stu-activiti5/src/main/resources/result/" + name));    }}

启动流程实例

/**    * 启动流程实例    * 1.根据流程定义id启动    * 2.根据流程定义key启动(重点)--框架会自动选中最新版本的流程定义启动流程实例    */@Testpublic void test5() throws IOException {    //方式一:根据流程定义id启动    //String processDefinitionId = "myProcess_qjlc:4:15006";//流程定义id    //processEngine.getRuntimeService().startProcessInstanceById(processDefinitionId);    //方式二:根据流程定义key启动(重点)--框架会自动选中最新版本的流程定义启动流程实例    String processDefinitionKey = "myProcess_qjlc";//流程定义key    ProcessInstance processInstance = processEngine.getRuntimeService().startProcessInstanceByKey(processDefinitionKey);    System.out.println(processInstance.getId());}

查询流程实例

/**    * 查询流程实例    */@Testpublic void test6() throws IOException {    List<ProcessInstance> list = processEngine.getRuntimeService().createProcessInstanceQuery().list();    for (ProcessInstance processInstance : list) {        System.out.println(processInstance);    }}

删除流程实例

/**    * 删除流程实例    */@Testpublic void test7() {    String processInstanceId = "22501";//流程实例id    String deleteReason = "不请假了";//删除原因    processEngine.getRuntimeService().deleteProcessInstance(processInstanceId, deleteReason);}

查询个人任务

/**    * 查询个人任务    */@Testpublic void test8() {    TaskQuery query = processEngine.getTaskService().createTaskQuery();    query.taskAssignee("李四");    List<Task> list = query.list();    for (Task task : list) {        System.out.println(task);    }}

办理个人任务

/**    * 办理个人任务    */@Testpublic void test9() {    String taskId = "25002";    processEngine.getTaskService().complete(taskId);}}

总结API

#几个接口(和表有对应关系)Deployment对应act_re_deploymentProcessDefinition对应act_re_procdefProcessInstance对应act_ru_executionTask对应act_ru_task#几个Query对象,对应可以查询表DeploymentQuery对应act_re_deploymentProcessDefinitionQuery对应act_re_procdefProcessInstanceQuery对应act_ru_executionTaskQuery对应act_ru_task#几个Service对象RepositoryService:流程定义相关操作,静态资源RuntimeService:流程实例相关操作,启动流程实例、查询流程实例、删除流程实例TaskService:任务相关操作,查询任务、办理任务、查询组任务、拾取组任务IdentityService:用户身份相关操作,创建用户、创建组、将用户加入到组中HistoryServiceFormService
原创粉丝点击