您的位置:首页 > 其它

初识Activiti工作流

2016-07-29 15:40 218 查看
一:简介

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)通过代码创建
@Test
public 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.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  -->
<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>


@Test
public void createProcessEngine(){

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


               (3)通过ProcessEngines 来获取默认的流程引擎(推荐)
@Test
public void createProcessEngine(){

ProcessEngine processEngine=ProcessEngines.getDefaultProcessEngine();
System.out.println("通过ProcessEngines 来获取流程引擎");
}


               (4)结果:

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



          3、部署流程定义
@Test
public 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.执行流程
@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
}
影响表:

act_ru_execution :流程执行到哪一个任务



act_ru_task: 当前执行的任务



act_ru_identitylink :执行人



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

}
}

}




 

          6.完成任务

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


再查看任务表



任务转换到下一个。然后后面的任务完成和上面就一样了。这样,一个简单的工作流就完成了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息