初识Activiti工作流

来源:互联网 发布:js跳出each循环函数 编辑:程序博客网 时间:2024/06/05 20:15
一:简介
1. 工作流引擎 :ProcessEngine ,它是Activiti的核心类,由该类可以获取其他的服务实例
                 (历史服务、仓库服务、任务服务、用户参与者服务)
2. BPMN  :UML :用例图、类图、时序图
       业务流程建模与标注(Business Process Model and Notation,BPMN) ,
       描述流程的基本符号,包括这些图元如何组合成一个业务流程图(Business Process Diagram)
3. 数据库
       Activiti的后台是有数据库的支持,所有的表都以ACT_开头。
       第二部分是表示表的用途的两个字母标识。 用途也和服务的API对应
       Activiti的工作流数据库有23张表    
         要保存流程定义
        - act_ge_*  :通用表
        - act_hi_*  :历史流程相关表
        - act_re_*  :仓库表:保存流程定义
        - act_ru_*  :保存流程运行相关的表  
        - act_id_*  :用户参与相关的表 
4. activiti.cfg.xml  
        Activiti核心配置文件,配置流程引擎创建工具的基本参数和数据库连接参数
5. logging.properties    :log4j   
二:搭建Activiti开发环境
    1. Acitiviti软件环境
      * JDK ,1.6版本及以上
      * 数据库 支持的有:h2\mysql\oracle\mssql\db2等 ,选择mysql
      * 支持Activiti 5 运行的jar包 ,在activiti-5.13\wars\activiti-rest \WEB-INF\lib添加 ,
        可以在官网下载:www.activiti.org
      * 集成开发环境:Myeclipse 8.6及以上  最好 myeclipse 2014
    2. 安装流程设计器  bpmn :业务流程建模与标注(Business Process Model and Notation,BPMN)
      * 有网络安装  
      * 无网情况   :直接添加插件
         把压缩包中的内容放入eclipse根目录的dropins文件夹下    
      * 注意:打开菜单Windows->Preferences->Activiti->Save actions
           把*bpmn 和*.png同步保存
     3. Activiti 架构及核心API
        -  activiti.cfg.xml
        -  ProcessEngineConfigration
        -  ProcessEngine
        - RepositoryService
        - TaskService
        - IdentityService
        - FormService
        - RuntimeService
        - ManagementService
        - HistoryService
三、HelloActiviti程序(模拟Activiti流程执行)
          1.创建activiti工程HelloActiviti,并导入所需要的jar包
          2.在/helloActivity/src/main/resources/diagrams目录下新建activiti diagram,通过拖拽的方式完成更如下图,并进行配置


具体参数配置如下:
a、配置工作流:


b、配置任务



c、配置任务执行者

这样就对整个工作流配置完成

          3、创建流程引擎及工作流数据表
          a、 核心api图:

可以看出,先取得ProcessEngineConfiguration 对象 ,再由该对象来构建ProcessEngine,再通过它来获取服务。
         b、创建ProcessEngine(三种方式)
               (1)通过代码创建
@Testpublic void createProcessEngine(){//获取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");engineConfiguration.setDatabaseSchemaUpdate("true");//创建ProcessEngine对象ProcessEngine processEngine = engineConfiguration.buildProcessEngine();System.out.println("流程引擎创建成功!");}

               (2)通过加载 activiti.cfg.xml 获取 流程引擎 和自动创建数据库及表
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.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"> <!-- 配置 ProcessEngineConfiguration  --> <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/activitiDB?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf8"></property> <property name="jdbcUsername" value="root"></property> <property name="jdbcPassword" value="root"></property>   <!-- 配置创建表策略 :没有表时,自动创建 -->  <property name="databaseSchemaUpdate" value="true"></property> </bean></beans>


@Testpublic void createProcessEngine(){ProcessEngineConfiguration engineConfiguration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml") ;ProcessEngine processEngine = engineConfiguration.buildProcessEngine();System.out.println("流程引擎创建成功!");}

               (3)通过ProcessEngines 来获取默认的流程引擎(推荐)
@Testpublic void createProcessEngine(){ProcessEngine processEngine=ProcessEngines.getDefaultProcessEngine();     System.out.println("通过ProcessEngines 来获取流程引擎");}

               (4)结果:
       数据库中会多了许多表!这也就说明工作流引擎创建成功!


          3、部署流程定义
@Testpublic void deploy(){//获取仓库服务 :管理流程定义RepositoryService repositoryService = processEngine.getRepositoryService();Deployment deploy = repositoryService.createDeployment()//创建一个部署的构建器.addClasspathResource("diagrams/LeaveBill.bpmn")//从类路径中添加资源,一次只能添加一个资源.addClasspathResource("diagrams/LeaveBill.png")//从类路径中添加资源,一次只能添加一个资源.name("请求单流程")//设置部署的名称.category("办公类别")//设置部署的类别.deploy();System.out.println("部署的id"+deploy.getId());System.out.println("部署的名称:"+deploy.getName());}
 影响的表:
        act_re_procdef :流程定义表 :
        该表的key属性 是bpmn 的 id决定  
        该表的name属性  是bpmn 的name 属性决定

    act_re_deployment:部署表 :id是由act_ge_property的 next_dbid决定

    act_ge_property :通用属性表

          4.执行流程
@Testpublic void startProcess(){String processDefiKey="LeaveBill";//取运行时服务RuntimeService runtimeService = processEngine.getRuntimeService();//取得流程实例ProcessInstance pi = runtimeService.startProcessInstanceByKey(processDefiKey);//通过流程定义的key 来执行流程System.out.println("流程实例id:"+pi.getId());//流程实例idSystem.out.println("流程定义id:"+pi.getProcessDefinitionId());//输出流程定义的id}
影响表:
act_ru_execution :流程执行到哪一个任务


act_ru_task: 当前执行的任务

act_ru_identitylink :执行人


          5.查询任务
//查询任务 @Testpublic 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());}}}


 
          6.完成任务

@Testpublic void compileTask(){String taskId="104";//taskId:任务idprocessEngine.getTaskService().complete(taskId);System.out.println("当前任务执行完毕");}

再查看任务表


任务转换到下一个。然后后面的任务完成和上面就一样了。这样,一个简单的工作流就完成了。


1 0
原创粉丝点击