Activiti第一篇【介绍、配置开发环境、快速入门】

Activiti介绍

什么是Activiti?

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

咱们即将学习的是一个业务流程管理框架, 常见开源工做流引擎框架 : OSWorkFlow、jBPM(jboss business process management),Activiti工做流(是对jBPM升级)。通常咱们称做为工做流框架..java

为何要学习Activiti

那咱们为何要学习业务流程管理框架呢???学习它干吗???工做流(Workflow),就是“业务过程的部分或总体在计算机应用环境下的自动化”mysql

咱们来提出一个常见的需求来更好地理解:web

咱们在学生时代,确定会遇到请假写请假条的状况,若是学校的请假抓得很是严,就须要通过多层的赞成才能肯定能不能请假..spring

这里写图片描述

班主任->任课老师->教学总监->校长这么一个流程,首先咱们先明确一点:咱们做为一个学生,不可能直接跳过老师,去找校长申请请假的【校长是你随便找的吗??】sql

所以咱们请假的流程是一步一步的,并不能作跳跃数据库

也就是说,当班主任没有批准请假的时候,即便你去找任课老师了,任课老师会让你回去找班主任的,做为任课老师了,只关注班主任有没有批准你请假,同理,做为校长,只关注教学总监有没有批准你请假express

进一步说:当教学总监尚未批准你请假时,你请假的请求是不会出如今校长的范围里的json

实际上是很是好理解的,就是一步步往下执行,当尚未执行到本身处理的点子上时,是不会有对应的处理请求的。分工有序api

对上面的请假流程进行分析,若是咱们没有使用框架,而把这么一个请假流程写到咱们的网站中,咱们会怎么作呢??

这里写图片描述

咱们须要维护一个变量,来不断传递过去给下一个处理者…若是一切正常,需求不会变,并无条件的处理。这是咱们很是但愿看到的…可是,若是有条件判断【请假三天如下、请假三天以上的处理方式不同】,需求会变【不须要校长批准了,教学总监批准完,你就可以请假了】,那么咱们的代码就会变得乱

基于这么一个缘由,咱们是须要学习一个框架来帮咱们完成工做流的…

采用工做流管理系统的优势

  • 一、提升系统的柔性,适应业务流程的变化
  • 二、实现更好的业务过程控制,提升顾客服务质量
  • 三、下降系统开发和维护成本

快速入门Activiti

首先咱们来梳理一下Activiti的开发步骤:

  1. 咱们要用到一个工做流,首先就要把这个工做流定义出来【也就是工做流的步骤的怎么样的】,Activiti支持以“图”的方式来定义工做流
  2. 定义完工做流,就要部署到起来【咱们能够联想到Tomcat,咱们光下载了Tomcat是没有用的,要把它部署起来】
  3. 随后咱们就执行该工做流,该工做流就随着咱们定义的步骤来一一执行!

BPMN

业务流程建模与标注(Business Process Model and Notation,BPMN) ,描述流程的基本符号,包括这些图元如何组合成一个业务流程图(Business Process Diagram)

BPMN这个就是咱们所谓把工做流定义出来的流程图..

数据库相关

咱们在执行工做流步骤的时候会涉及到不少数据【执行该流程的人是谁、所须要的参数是什么、包括想查看以前流程执行的记录等等】,所以咱们会须要用到数据库的表来保存数据…

因为咱们使用的是Activiti框架,这个框架会自动帮咱们把对应的数据库表建立起来,它涉及的表有23个,可是经常使用的并非不少,所以也不用很慌…

下面就列举一下表的状况

Activiti的后台是有数据库的支持,全部的表都以ACT_开头。 第二部分是表示表的用途的两个字母标识。 用途也和服务的API对应。
ACT_RE_*: 'RE'表示repository。 这个前缀的表包含了流程定义和流程静态资源 (图片,规则,等等)。
ACT_RU_*: 'RU'表示runtime。 这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据。 Activiti只在流程实例执行过程当中保存这些数据, 在流程结束时就会删除这些记录。 这样运行时表能够一直很小速度很快。
ACT_ID_*: 'ID'表示identity。 这些表包含身份信息,好比用户,组等等。
ACT_HI_*: 'HI'表示history。 这些表包含历史数据,好比历史流程实例, 变量,任务等等。
ACT_GE_*: 通用数据, 用于不一样场景下,如存放资源文件。

搭建配置环境

我这里使用的Intellij idea来使用Activiti,首先,咱们得下载插件来使用Activiti【由于定义流程图须要用到插件】

详情能够看这篇博文:http://blog.sina.com.cn/s/blog_4b3196670102woix.html

Activiti插件中文乱码问题:

http://www.cnblogs.com/mymelody/p/6049291.html

流程以前的连线是经过图中的蓝色小点点拖动来进行链接的

导入对应的jar包

  • activation-1.1.jar
  • activiti-bpmn-converter-5.13.jar
  • activiti-bpmn-layout-5.13.jar
  • activiti-bpmn-model-5.13.jar
  • activiti-common-rest-5.13.jar
  • activiti-engine-5.13.jar
  • activiti-json-converter-5.13.jar
  • activiti-rest-5.13.jar
  • activiti-simple-workflow-5.13.jar
  • activiti-spring-5.13.jar
  • aopalliance-1.0.jar
  • commons-dbcp-1.4.jar
  • commons-email-1.2.jar
  • commons-fileupload-1.2.2.jar
  • commons-io-2.0.1.jar
  • commons-lang-2.4.jar
  • commons-pool-1.5.4.jar
  • h2-1.3.170.jar
  • hamcrest-core-1.3.jar
  • jackson-core-asl-1.9.9.jar
  • jackson-mapper-asl-1.9.9.jar
  • javaGeom-0.11.0.jar
  • jcl-over-slf4j-1.7.2.jar
  • jgraphx-1.10.4.2.jar
  • joda-time-2.1.jar
  • junit-4.11.jar
  • log4j-1.2.17.jar
  • mail-1.4.1.jar
  • mybatis-3.2.2.jar
  • mysql-connector-java.jar
  • org.restlet.ext.fileupload-2.0.15.jar
  • org.restlet.ext.jackson-2.0.15.jar
  • org.restlet.ext.servlet-2.0.15.jar
  • org.restlet-2.0.15.jar
  • slf4j-api-1.7.2.jar
  • slf4j-log4j12-1.7.2.jar
  • spring-aop-3.1.2.RELEASE.jar
  • spring-asm-3.1.2.RELEASE.jar
  • spring-beans-3.1.2.RELEASE.jar
  • spring-context-3.1.2.RELEASE.jar
  • spring-core-3.1.2.RELEASE.jar
  • spring-expression-3.1.2.RELEASE.jar
  • spring-jdbc-3.1.2.RELEASE.jar
  • spring-orm-3.1.2.RELEASE.jar
  • spring-tx-3.1.2.RELEASE.jar

开发步骤

上面已经说过了,咱们要想使用Activiti就须要有数据库的支持,虽然Activiti是自动帮咱们建立对应的数据库表,可是咱们是须要配置数据库的信息的。咱们配置数据库的信息,接着拿到Activiti最重要的API——Activiti引擎

这里写图片描述

获得工做流引擎

Activiti提供使用代码的方式来配置数据库的信息

 @Test public void createActivitiEngine(){ /* *1.经过代码形式建立 * - 取得ProcessEngineConfiguration对象 * - 设置数据库链接属性 * - 设置建立表的策略 (当没有表时,自动建立表) * - 经过ProcessEngineConfiguration对象建立 ProcessEngine 对象*/ //取得ProcessEngineConfiguration对象 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("root"); // 设置建立表的策略 (当没有表时,自动建立表) // 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对象建立 ProcessEngine 对象 ProcessEngine processEngine = engineConfiguration.buildProcessEngine(); System.out.println("流程引擎建立成功!"); }

Activiti也能够经过配置文件来配置数据库的信息,加载配置文件从而获得工做流引擎

/**2. 经过加载 activiti.cfg.xml 获取 流程引擎 和自动建立数据库及表 * ProcessEngineConfiguration engineConfiguration= ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml"); //从类加载路径中查找资源 activiti.cfg.xm文件名能够自定义 ProcessEngine processEngine = engineConfiguration.buildProcessEngine(); System.out.println("使用配置文件Activiti.cfg.xml获取流程引擎"); */

这里写图片描述

上面的那种加载配置文件方式,配置文件的名字是能够自定义的,若是咱们配置文件的名字默认就是activiti.cfg.xml的话,也是放在类路径下,咱们就可使用默认的方式来进行加载了!

 @Test public void createActivitiEngine(){ /** * 3. 经过ProcessEngines 来获取默认的流程引擎 */ // 默认会加载类路径下的 activiti.cfg.xml ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); System.out.println("经过ProcessEngines 来获取流程引擎"); } 

定义工做流

定义工做流就须要咱们刚才下载的插件了,咱们是使用图形的方式来定义工做流的….

这里写图片描述

在每一个流程中,咱们均可以指定对应的处理人是谁,交由谁处理

部署工做流

咱们上面已经定义了工做流了,工做流引擎咱们也已经拿到了,接下来就是把工做流部署到工做流引擎中了

@Test
    public void deploy() {

        //获取仓库服务 :管理流程定义
        RepositoryService repositoryService = processEngine.getRepositoryService();
        Deployment deploy = repositoryService.createDeployment()//建立一个部署的构建器
                .addClasspathResource("LeaveActiviti.bpmn")//从类路径中添加资源,一次只能添加一个资源
                .name("请求单流程")//设置部署的名称
                .category("办公类别")//设置部署的类别
                .deploy();

        System.out.println("部署的id"+deploy.getId());
        System.out.println("部署的名称"+deploy.getName());
    }

相对应的数据库表就会插入数据、涉及到的数据库表后面会详细说明。如今咱们只要了解到,咱们工做流引擎执行操做会有数据库表记录

这里写图片描述


执行工做流

指定指定工做流就是咱们定义时工做流程表的id

这里写图片描述

 @Test public void startProcess(){ //指定执行咱们刚才部署的工做流程 String processDefiKey="leaveBill"; //取运行时服务 RuntimeService runtimeService = processEngine.getRuntimeService(); //取得流程实例 ProcessInstance pi = runtimeService.startProcessInstanceByKey(processDefiKey);//经过流程定义的key 来执行流程 System.out.println("流程实例id:"+pi.getId());//流程实例id System.out.println("流程定义id:"+pi.getProcessDefinitionId());//输出流程定义的id }

查询当前任务的信息

刚才咱们已经开始了工做流了,随后工做流应该去到了申请请假的流程,申请请假的处理人是钟福成,咱们能够查询出对应的信息:

//查询任务
    @Test
    public void queryTask(){
        //任务的办理人
        String assignee="钟福成";
        //取得任务服务
        TaskService taskService = processEngine.getTaskService();
        //建立一个任务查询对象
        TaskQuery taskQuery = taskService.createTaskQuery();
        //办理人的任务列表
        List<Task> list = taskQuery.taskAssignee(assignee)//指定办理人
                .list();
        //遍历任务列表
        if(list!=null&&list.size()>0){
            for(Task task:list){
                System.out.println("任务的办理人:"+task.getAssignee());
                System.out.println("任务的id:"+task.getId());
                System.out.println("任务的名称:"+task.getName());
            }
        }
    }

这里写图片描述

处理任务

咱们如今处理流程去到“申请请假”中,处理人是钟福成…接着就是钟福成去处理任务,根据任务的id使得流程继续往下走

任务的id刚才咱们已经查询出来了【上面】,咱们若是是在web端操做数据的话,那么只要传递过去就好了!

 //完成任务 @Test public void compileTask(){ String taskId="304"; //taskId:任务id processEngine.getTaskService().complete(taskId); System.out.println("当前任务执行完毕"); }

这里写图片描述

当咱们处理完该任务的时候,就到了批准【班主任】任务了,咱们查询一下是否是如咱们想象的效果:

这里写图片描述

咱们按照定义的工做流程图一步一步往下走,最终把流程走完

这里写图片描述

相关文章
相关标签/搜索