zoukankan      html  css  js  c++  java
  • Activiti工作流

    一、什么是工作流

           工作流(Workflow),就是“业务过程的部分或整体在计算机应用环境下的自动化”,它主要解决的是“使在多个参与者之间按照某种预定义的规则传递文档、信息或任务的过程自动进行,从而实现某个预期的业务目标,或者促使此目标的实现”。

           工作流管理系统(Workflow Management System,WfMS)是一个软件系统,它完成工作量的定义和管理,并按照在系统中预先定义好的工作流逻辑进行工作流实例的执行。工作流管理系统不是企业的业务系统,而是为企业的业务系统的运行提供了一个软件的支撑环境。

    二、   常见的工作流框架

    流行的工作流框架有:Activity5.13、JBPM4.4、OSWorkFlow、WorkFlow

    工作流框架底层需要有数据库提供支持,activiti5.13版本,有23张表。

    JBPM4.4框架底层有数据库支持,18张表。

    JBPM底层使用hibernate操作数据库。

    Activiti框架底层使用的mybatis操作数据库。

    三、    Activiti5介绍

    Activiti5是由Alfresco软件在2010年5月17日发布的业务流程管理(BPM)框架,它是覆盖了业务流程管理、工作流、服务协作等领域的一个开源的、灵活的、易扩展的可执行流程语言框架。Activiti基于Apache许可的开源BPM平台,创始人Tom Baeyens是JBoss jBPM的项目架构师,它特色是提供了eclipse插件,开发人员可以通过插件直接绘画出业务流程图。

    四、   安装activiti流程设计器插件

    第一步:获得下载activiti-eclipse插件的安装包


    第二步:解压安装包,复制解压文件里面的activiti到eclipse中的dropins目录中


    第三步:重启eclipse,勾选save选项


    第四步:如果重启eclipse无法显示activiti图标,表明所使用的eclipse版本不支持该插件,可以选择换myeclipse或其他版本的eclipse

    五、   初始化activiti框架数据表

    5.1  下载activiti框架     

    Activiti框架下载地址:http://activiti.org/

    5.2创建一个数据库

    5.3使用activiti框架的自动建表功能

    activiti框架提供了和hibernate类似的自动建表功能

    搭建开发环境:

    第一步:创建一个Java项目activiti1110

    第二步:导入jar包(从下载下来的activiti-5.13工作流引擎下面的DEMO导入jar包),还需要导入MySQL驱动包

    1、不使用配置文件(不建议)

    测试代码:

     

     1     package net.csdn.activiti;  
     2        
     3     import org.activiti.engine.ProcessEngine;  
     4     importorg.activiti.engine.ProcessEngineConfiguration;  
     5     import org.junit.Test;  
     6        
     7     public class HelloWorld {  
     8        /** 
     9         * 使用activiti框架提供的自动建表(没有配置文件) 
    10         */  
    11         
    12        @Test  
    13        public void test1(){  
    14           //创建一个流程引擎配置对象  
    15           ProcessEngineConfiguration configuration =ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration();  
    16           //配置数据源  
    17           configuration.setJdbcDriver("com.mysql.jdbc.Driver");  
    18             configuration.setJdbcUrl("jdbc:mysql://localhost:3306/activiti_1110?useUnicode=true&characterEncoding=UTF-8");  
    19           configuration.setJdbcUsername("root");  
    20             configuration.setJdbcPassword("root");  
    21             //设置自动建表  
    22             configuration.setDatabaseSchemaUpdate("true");  
    23             //创建一个流程引擎对象,在创建流程引擎对象过程中会自动创建表  
    24             ProcessEngine processEngine =configuration.buildProcessEngine();  
    25        }  
    26     }  

    2、使用配置文件

     配置文件activiti-context.xml如下:

     1     <beans xmlns="http://www.springframework.org/schema/beans"  
     2        xmlns:context="http://www.springframework.org/schema/context"  
     3        xmlns:tx="http://www.springframework.org/schema/tx"  
     4        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
     5        xsi:schemaLocation="http://www.springframework.org/schema/beans  
     6        http://www.springframework.org/schema/beans/spring-beans.xsd  
     7        http://www.springframework.org/schema/context  
     8        http://www.springframework.org/schema/context/spring-context-2.5.xsd  
     9         http://www.springframework.org/schema/tx  
    10         http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">  
    11         
    12        <!-- 配置流程引擎配置对象 -->  
    13        <bean id="processEngineConfiguration"  
    14           class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">  
    15           <property name="jdbcDriver" value="com.mysql.jdbc.Driver" />  
    16           <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/activiti_1110"/>  
    17           <property name="jdbcUsername" value="root" />  
    18           <property name="jdbcPassword" value="root" />  
    19           <property name="databaseSchemaUpdate" value="true" />  
    20        </bean>  
    21     </beans>  

    测试代码:

     1     /** 
     2      * 使用框架提供的自动建表(提供配置文件)---配置文件activiti-context.xml可以从框架提供的例子程序中获取 
     3      */  
     4     @Test  
     5     public void test2() {  
     6        String resource = "activiti-context.xml";// 配置文件名称  
     7        String beanName = "processEngineConfiguration";// 配置id值  
     8        ProcessEngineConfiguration conf =ProcessEngineConfiguration  
     9              .createProcessEngineConfigurationFromResource(resource,  
    10                     beanName);  
    11        ProcessEngine processEngine =conf.buildProcessEngine();  
    12     }  

    3、使用配置文件(使用默认配置)

    要求配置文件名称必须为activiti-context.xml或者activiti.cfg.xml因为,因为默认的配置ProcessEngines.getDefaultProcessEngine();会初始化这两个文件的其中一个,默认的配置信息如下


    测试代码:

    1 /** 
    2     * 使用框架提供的自动建表(使用配置文件) 
    3     */  
    4    @Test  
    5    public void test3() {  
    6       ProcessEngine processEngine =ProcessEngines.getDefaultProcessEngine();  
    7    } 

    六、了解23张表

    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_*: 通用数据, 用于不同场景下。

    资源库流程规则表

      1)      act_re_deployment     部署信息表

      2)    act_re_model    流程设计模型部署表

      3)    act_re_procdef       流程定义数据表

    运行时数据库表

      1)    act_ru_execution      运行时流程执行实例表

      2)    act_ru_identitylink    运行时流程人员表,主要存储任务节点与参与者的相关信息

      3)    act_ru_task       运行时任务节点表

      4)    act_ru_variable  运行时流程变量数据表

    历史数据库表

      1)    act_hi_actinst          历史节点表

      2)    act_hi_attachment          历史附件表

      3)    act_hi_comment       历史意见表

      4)    act_hi_identitylink           历史流程人员表

      5)    act_hi_detail             历史详情表,提供历史变量的查询

      6)    act_hi_procinst        历史流程实例表

      7)    act_hi_taskinst         历史任务实例表

      8)    act_hi_varinst          历史变量表 

    组织机构表

      1)    act_id_group           用户组信息表

      2)    act_id_info        用户扩展信息表

      3)    act_id_membership  用户与用户组对应信息表

      4)    act_id_user        用户信息表

      这四张表很常见,基本的组织机构管理,关于用户认证方面建议还是自己开发一套,组件自带的功能太简单,使用中有很多需求难以满足

    通用数据表

      1)    act_ge_bytearray           二进制数据表

      2)    act_ge_property       属性数据表存储整个流程引擎级别的数据,初始化表结构时,会默认插入三条记录

    七、核心对象ProcessEngine

      ProcessEngine类,一般称为流程引擎类,没错,这个流程引擎就是我们上一篇文章中提到的流程引擎,它是activiti中最核心的类,并且这个类是线程安全的,所有的线程和请求都可以使用同一个ProcessEngine对象,其它常用类几乎也都是由它而来的。

    得到ProcessEngine对象:

      方式1:使用classpath根目录下的默认配置文件jbpm.cfg.xml创建一个单例的ProcessEngine

     

        ProcessEngineprocessEngine = ProcessEngines.getDefaultProcessEngine();

     

      方式2:指定其他位置:配置文件,如src根目录config包下的my-jbpm-cfg.xml。

      ProcessEngineprocessEngine = ProcessEngineConfiguration .createProcessEngineConfigurationFromResource("config/my-jbpm-cfg.xml").buildProcessEngine();

     

    八、service

        1、RepositoryService

      RepositoryService是管理流程定义的仓库服务的接口。

      RepositoryServicerepositoryService = processEngine.getRepositoryService();

      2、RuntimeService

      RuntimeService是activiti的流程执行服务类。可以从这个服务类中获取很多关于流程执行相关的信息,如执行管理,包括启动、推进、删除流程实例等操作。

      RuntimeServiceruntimeService = processEngine.getRuntimeService(); 

      3、TaskService:

      TaskService是activiti的任务服务类。可以从这个类中获取任务的信息。

      TaskServicetaskservice = processEngine.getTaskService();

      4、HistoryService:

      HistoryService是activiti的查询历史信息的类。在一个流程执行完成后,这个对象为我们提供查询历史信息。

      HistoryServicehistoryService = processEngine.getHistoryService();

    九、部署流程

    1. 使用文件部署

     1 /**部署流程定义*/
     2     @Test
     3     public void deploymentProcessDefinition_classpath(){
     4         Deployment deployment = processEngine.getRepositoryService() // 与流程定义和部署对象相关的Service
     5                             .createDeployment() // 创建一个部署对象
     6                             .name("流程定义") // 设置对应流程的名称
     7                             .addClasspathResource("diagrams/helloworld.bpmn") // 从Classpath的资源中加载,一次只能加载一个文件(windows与linux下面要区分)
     8                             .addClasspathResource("diagrams/helloworld.bpmn") // 从Classpath的资源中加载,图片
     9                             .deploy(); // 完成部署
    10 
    11         System.out.println("部署Id:"+deployment.getId()); // 部署Id:20001
    12         System.out.println("部署名称:"+deployment.getName()); // 部署名称:流程定义
    13     }

    2. 使用流程定义zip文件部署

     1 /**部署流程定义zip文件*/
     2     @Test
     3     public void deploymentProcessDefinition_zip(){
     4         InputStream in = this.getClass().getClassLoader().getResourceAsStream("zip/helloworld.zip");
     5         ZipInputStream zipInputStream = new ZipInputStream(in);
     6         Deployment deployment = processEngine.getRepositoryService() // 与流程定义和部署对象相关的Service
     7                         .createDeployment() // 创建一个部署对象
     8                         .name("zip流程定义") // 添加部署的名称
     9                         .addZipInputStream(zipInputStream) // 制定zip格式文件完成部署
    10                         .deploy(); // 完成部署
    11         System.out.println("部署Id:"+deployment.getId()); // 部署Id:22501
    12         System.out.println("部署名称:"+deployment.getName()); // 部署名称:zip流程定义
    13     }

    3. 使用输入流部署:

     1 /**部署流程定义zip文件*/
     2     @Test
     3     public void deploymentProcessDefinition_inputStream(){
     4         InputStream inputStreambpmn = this.getClass().getResourceAsStream("/diagrams/processVariables.bpmn");
     5         InputStream inputStreampng = this.getClass().getResourceAsStream("/diagrams/processVariables.png");
     6         
     7         
     8         Deployment deployment = processEngine.getRepositoryService() // 与流程定义和部署对象相关的Service
     9                         .createDeployment() // 创建一个部署对象
    10                         .name("流程定义输入流") // 添加部署的名称
    11                         .addInputStream("processVariables.bpmn", inputStreambpmn)// 使用资源文件名称(要求与资源文件的名称要一致),和输入流完成部署
    12                         .addInputStream("processVariables.png", inputStreampng)// 使用资源文件名称(要求与资源文件的名称要一致),和输入流完成部署
    13                         .deploy(); // 完成部署
    14         System.out.println("部署Id:"+deployment.getId()); // 部署Id:55001
    15         System.out.println("部署名称:"+deployment.getName()); // 部署名称:流程定义输入流
    16     }

     十. 启动流程实例:

      1. 什么是流程实例:就是一个活生生的流程、流程定义是定义了这一类的流程是如何的,而流程实例就是真正的业务流程。一切操作的基础都基于流程实例

      2. 启动流程实例:

     1 /** 启动流程实例 */
     2     @Test
     3     public void startProcessInstance(){
     4         String processDefinitionKey = "psocessVariables"; // 使用Key的启动,默认按照对心版本的流程定义启动
     5         ProcessInstance pi = processEngine.getRuntimeService() // 与正在执行的流程实例和执行对象相关的Service
     6                         .startProcessInstanceByKey(processDefinitionKey); // 使用流程定义的Key启动流程实例,key对应helloworld.bpmn文件中的流程名称
     7         
     8         System.out.println("流程实例Id"+pi.getId()); // 流程实例Id:57501
     9         System.out.println("流程定义Id"+pi.getProcessDefinitionId()); // 流程定义Id:psocessVariables:1:55004
    10     }
  • 相关阅读:
    POJ 1469 COURSES 二分图最大匹配
    POJ 1325 Machine Schedule 二分图最大匹配
    USACO Humble Numbers DP?
    SGU 194 Reactor Cooling 带容量上下限制的网络流
    POJ 3084 Panic Room 求最小割
    ZOJ 2587 Unique Attack 判断最小割是否唯一
    Poj 1815 Friendship 枚举+求最小割
    POJ 3308 Paratroopers 最小点权覆盖 求最小割
    1227. Rally Championship
    Etaoin Shrdlu
  • 原文地址:https://www.cnblogs.com/zq-boke/p/7122125.html
Copyright © 2011-2022 走看看