BOS项目练习(工作流,activiti入门)

内容:

1、工作流概念

2、安装eclipse插件(工作流流程设计器插件)

3、创建activiti框架提供的数据库表结构(23张表)

4、学习工作流框架API,操作流程

 

1.    工作流概念

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


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

 

常见的工作流框架:JBPM4.4、activiti5.13、OSWorkFlow

 

2.    安装流程设计器eclipse插件

JDK1.6或者更高版本 

    解压压缩文件到eclipse的dropins目录中

 activiti-eclipse-plugin.zip

    重启eclipse,勾选save选项(自动生成流程图)

 


安装成功后new->Other…打开面板后可以看到activiti即安装成功


activiti目录结构:

database:数据库建/删/更新表sql

docs:Java文档,用户向导,约束xsd

libs:jar包

wars:案例 


activiti框架底层有一套数据库表提供支持,activiti5.13版本对应23张表,JBPM4.4对应18张表。工作流框架底层使用持久化技术和数据库交互,activiti框架底层使用mybatis操作数据库,JBPM底层使用hibernate操作数据库。

 

3.    创建activiti框架表结构

3.1   执行框架提供的sql文件建表(建议)

创建sql文件位置activiti-5.13\database\create里

执行命令:

 source 把sql文件拖进来


3.2   使用框架提供的自动建表功能建表


jar包:

*在activiti-5.16.1->wars目录下是一些示例项目,解压activiti-rest项目,导入activiti-rest目录中WEB-INF\lib下所有包。添加到classpath中

*手动导入数据库驱动包例如MySQL-connector-java.jar

--eclipse如何手动创建library

--右键随意library(比如JRE)→bulid path→configureulid path→libraries →add library  →user library→user libraries →new →命名 →add jar →去工作空间的项目lib找到jar ,

创建完成 删除显示在外面的奶瓶即可


使用默认的配置文件

activiti-rest\WEB-INF\classes下有:
activiti-context.xml : 一个类似spring结构的配置文件,清空内容后改名为activiti.cfg.xml,用来做流程引擎的相关配置

文件中bean的ID规定好的

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <beans xmlns="http://www.springframework.org/schema/beans"  
  2.     xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xsi:schemaLocation="http://www.springframework.org/schema/beans   
  5.                         http://www.springframework.org/schema/beans/spring-beans.xsd  
  6.                         http://www.springframework.org/schema/context   
  7.                         http://www.springframework.org/schema/context/spring-context-2.5.xsd  
  8.                         http://www.springframework.org/schema/tx   
  9.                         http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">  
  10.       
  11.     <!-- 配置流程引擎配置对象 -->  
  12.     <bean id="processEngineConfiguration"   
  13.         class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">  
  14.         <!-- 注入数据源信息 -->  
  15.         <property name="jdbcDriver" value="com.mysql.jdbc.Driver"></property>  
  16.         <property name="jdbcUrl" value="jdbc:mysql:///activiti_day1"></property>  
  17.         <property name="jdbcUsername" value="root" ></property>  
  18.         <property name="jdbcPassword" value="root"></property>  
  19.         <!-- 注入自动建表设置 -->  
  20.         <property name="databaseSchemaUpdate" value="true"></property>  
  21.     </bean>  
  22.       
  23.     <!-- 提供工厂bean,创建流程引擎对象 -->  
  24.     <bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">  
  25.         <property name="processEngineConfiguration" ref="processEngineConfiguration"></property>  
  26.     </bean>  
  27.   
  28. </beans>  


执行java代码:

调用ProcessEngines的getDefaultProceeEngine方法时会自动加载classpath下名为activiti.cfg.xml文件

流程引擎对象创建成功运行后数据库会自动建表

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. // 使用activiti框架提供的自动建表方式创建23张表  
  2. @Test  
  3. public void test3() {  
  4.     ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();  
  5. }  


4.    了解activiti提供的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_*: general 通用数据, 用于不同场景下。


.1资源库流程规则表

       1)    act_re_deployment        部署信息表

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

       3)    act_re_procdef      流程定义数据表

.2运行时数据库表

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

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

       3)    act_ru_task            运行时任务节点表

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

.3历史数据库表

       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        历史变量表

.4组织机构表

       1)    act_id_group          用户组信息表

       2)    act_id_info            用户扩展信息表

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

       4)    act_id_user            用户信息表

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

.5通用数据表

       1)    act_ge_bytearray           二进制数据表

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

 

 

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


5.    学习框架提供的API操作流程


    使用插件设计一个流程图

 

 

说明:流程定义文档有两部分组成:

       1)    bpmn文件

       流程规则文件。在部署后,每次系统启动时都会被解析,把内容封装成流程定义放入项目缓存中。Activiti框架结合这个xml文件自动管理流程。

       2)    展示流程图的图片

       在系统里需要展示流程的进展图片

 

6.    activiti框架核心API


6.1ProcessEngine

       说明:

       1)    在Activiti中最核心的类,其他的类都是由他而来。

       2)    产生方式:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();  

       3)    可以产生RepositoryService

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. RepositoryService repositoryService = processEngine.getRepositoryService();  

       4)    可以产生RuntimeService

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. RuntimeService runtimeService = processEngine.getRuntimeService();  

       5)    可以产生TaskService

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. TaskService taskService = processEngine.getTaskService();  

  各个Service的作用

RepositoryService管理流程定义
RuntimeService执行管理,包括启动、推进、删除流程实例等操作
TaskService任务管理
HistoryService 历史管理(执行完的数据的管理)
IdentityService 组织机构管理
 FormService一个可选服务,任务表单管理
ManagerService 


6.2RepositoryService

       是Activiti的仓库服务类。所谓的仓库指流程定义文档的两个文件:bpmn文件和流程图片。

       1)    可以产生DeploymentBuilder,用来定义流程部署的相关参数

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. DeploymentBuilder deploymentBuilder = repositoryService.createDeployment();  

       2)    删除流程定义

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. repositoryService.deleteDeployment(deploymentId);  

6.3RuntimeService

       是activiti的流程执行服务类。可以从这个服务类中获取很多关于流程执行相关的信息。

6.4TaskService

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

6.5ProcessDefinition

       流程定义类。可以从这里获得资源文件等。

6.6ProcessInstance

       代表流程定义的执行实例。如范冰冰请了一天的假,她就必须发出一个流程实例的申请。一个流程实例包括了所有的运行节点。我们可以利用这个对象来了解当前流程实例的进度等信息。

       从源代码中可以看出ProcessInstance继承自Execution。但在现实意义上有所区别:

       在单线流程中,ProcessInstance与Execution是一致的。

       并发执行时,  总线路代表ProcessInstance,而分线路中每个活动代表Execution。

6.7Execution

       Activiti用这个对象去描述流程执行的每一个节点。在没有并发的情况下,同ProcessInstance。

 

    查询对象


DeploymentQuery:查询部署表act_re_deployment

ProcessDefinitionQuery:查询流程定义表act_re_procdef

ProcessInstanceQuery:查询流程实例表act_ru_execution

TaskQuery:查询任务表act_ru_task

 

    几个和表对应的对象(接口)


Deployment:对应查询部署表act_re_deployment

ProcessDefinition:对应流程定义表act_re_procdef

ProcessInstance:对应流程实例表act_ru_execution

Task:对应任务表act_ru_task

 

7.    activiti框架API使用


7.1   部署流程定义操作

 

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public class ActivitiAPITest {  
  2.     ProcessEngine pe = ProcessEngines.getDefaultProcessEngine();  
  3.   
  4.     /** 
  5.      * 部署流程定义---- 将设计的流程图插入到数据库 
  6.      * 部署流程定义 方式一:加载单个的流程定义文件 方式二:加载zip压缩文件 
  7.      * 操作数据表:act_re_deployment(部署表)、act_re_procdef(流程定义表)、act_ge_bytearray(二进制表) 
  8.      * @throws Exception 
  9.      */  
  10.     @Test  
  11.     public void test1() throws Exception {  
  12.         DeploymentBuilder deploymentBuilder = pe.getRepositoryService()  
  13.                 .createDeployment();  
  14.         // 方式一:加载单个的流程定义文件  
  15.         // deploymentBuilder.addClasspathResource("test1.bpmn");  
  16.         // deploymentBuilder.addClasspathResource("test1.png");  
  17.         // Deployment deployment = deploymentBuilder.deploy();  
  18.   
  19.         // 方式二:加载zip压缩文件  
  20.         ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(  
  21.                 new File("d:\\process2.zip")));  
  22.         /* 
  23.          * ZipInputStream zipInputStream = new ZipInputStream(this.getClass() 
  24.          * .getClassLoader().getResourceAsStream("process.zip")); 
  25.          */  
  26.         deploymentBuilder.addZipInputStream(zipInputStream);  
  27.         deploymentBuilder.name("部署测试");  
  28.         //返回部署对象  
  29.         Deployment deployment = deploymentBuilder.deploy();  
  30.         String id = deployment.getId();  
  31.     }  
  32.   
  33.     /** 
  34.      * 查询部署信息数据,查询act_re_deployment 
  35.      */  
  36.     @Test  
  37.     public void test2() {  
  38.         // pe.getRepositoryService().createDeploymentQuery().list();//查询部署信息数据,查询act_re_deployment  
  39.         // pe.getRepositoryService().createProcessDefinitionQuery().list();//查询流程定义数据  
  40.         // pe.getRuntimeService().createProcessInstanceQuery().list();  
  41.         // pe.getTaskService().createTaskQuery().list();  
  42.         // pe.getHistoryService().createHistoricActivityInstanceQuery().list();  
  43.   
  44.         List<Deployment> list = pe.getRepositoryService()  
  45.                 .createDeploymentQuery().list();  
  46.         for (Deployment deployment : list) {  
  47.             System.out.println(deployment.getId() + " "  
  48.                     + deployment.getDeploymentTime());  
  49.         }  
  50.     }  
  51.   
  52.     /** 
  53.      * 删除部署信息 
  54.      */  
  55.     @Test  
  56.     public void test3() {  
  57.         String deploymentId = "401";// 部署ID  
  58.         pe.getRepositoryService().deleteDeployment(deploymentId);  
  59.         boolean cascade = true;// 是否级联删除  
  60.         pe.getRepositoryService().deleteDeployment(deploymentId, cascade);  
  61.     }  

 

7.2   流程定义操作


[java]  view plain  copy
  1. /** 
  2.  * 查询流程定义数据 
  3.  */  
  4. @Test  
  5. public void test4() {  
  6.     // 流程定义查询对象,操作的数据表act_re_procdef  
  7.     ProcessDefinitionQuery query = pe.getRepositoryService().createProcessDefinitionQuery();  
  8.     // 添加过滤条件  
  9.     query.processDefinitionNameLike("请假流程");  
  10.     // 添加排序条件  
  11.     query.orderByProcessDefinitionVersion().desc();  
  12.     List<ProcessDefinition> list = query.list();  
  13.     for (ProcessDefinition pd : list) {  
  14.         System.out.println(pd.getId() + " " + pd.getKey() + " "  
  15.                 + pd.getName() + " " + pd.getVersion());  
  16.     }  
  17. }  
  18.   
  19. /** 
  20.  * 删除流程定义数据,通过删除部署信息达到删除流程定义的目的 
  21.  */  
  22. @Test  
  23. public void test5() {  
  24.     String deploymentId = "301";  
  25.     pe.getRepositoryService().deleteDeployment(deploymentId);  
  26. }  
  27.   
  28. /** 
  29.  * 查询最新版本的流程定义数据 
  30.  */  
  31. @Test  
  32. public void test6() {  
  33.     List<ProcessDefinition> list = pe.getRepositoryService()  
  34.             .createProcessDefinitionQuery().latestVersion().list();  
  35.     for (ProcessDefinition processDefinition : list) {  
  36.         System.out.println(processDefinition.getId() + " "  
  37.                 + processDefinition.getKey() + " "  
  38.                 + processDefinition.getVersion());  
  39.     }  
  40. }  
  41.   
  42. /** 
  43.  * JBPM查询最新版本的流程定义数据 
  44.  */  
  45. @Test  
  46. public void test7() {  
  47.     ProcessDefinitionQuery query = pe.getRepositoryService()  
  48.             .createProcessDefinitionQuery();  
  49.     // 按照version升序  
  50.     query.orderByProcessDefinitionVersion().asc();  
  51.     List<ProcessDefinition> list = query.list();  
  52.     Map<String, ProcessDefinition> map = new HashMap<String, ProcessDefinition>();  
  53.     for (ProcessDefinition processDefinition : list) {  
  54.         map.put(processDefinition.getKey(), processDefinition);  
  55.     }  
  56.     System.out.println(map);  
  57.   
  58.     list = new ArrayList<>(map.values());  
  59.     for (ProcessDefinition processDefinition : list) {  
  60.         System.out.println(processDefinition.getId() + " "  
  61.                 + processDefinition.getName() + " "  
  62.                 + processDefinition.getVersion());  
  63.     }  
  64. }  
  65.   
  66. /** 
  67.  * 查询一次部署对应的流程定义文件名称和输入流 
  68.  *  
  69.  * @throws Exception 
  70.  */  
  71. @Test  
  72. public void test8() throws Exception {  
  73.     String deploymentId = "1401";// 部署ID  
  74.     List<String> names = pe.getRepositoryService()  
  75.             .getDeploymentResourceNames(deploymentId);  
  76.     for (String name : names) {  
  77.         System.out.println(name);  
  78.         InputStream in = pe.getRepositoryService().getResourceAsStream(deploymentId, name);  
  79.   
  80.         FileUtils.copyInputStreamToFile(in, new File("d:\\" + name));  
  81.         in.close();  
  82.   
  83.         /* 
  84.          * byte[] b = new byte[1024]; in.read(b); OutputStream out = new 
  85.          * FileOutputStream(new File("d:\\" + name)); out.write(b); 
  86.          *  
  87.          * out.close(); 
  88.          */  
  89.     }  
  90. }  
  91.   
  92. /** 
  93.  * 获得png图片文件的输入流 
  94.  *  
  95.  * @throws Exception 
  96.  */  
  97. @Test  
  98. public void test9() throws Exception {  
  99.     String processDefinitionId = "qjlc:2:104";// 流程定义ID  
  100.     InputStream pngStream = pe.getRepositoryService().getProcessDiagram(processDefinitionId);  
  101.     FileUtils.copyInputStreamToFile(pngStream, new File("d:\\my.png"));  
  102.     pngStream.close();  
  103. }  



 

7.3   流程实例操作

什么是流程实例??根据某个流程定义的一次具体的执行过程就是一个流程实例。流程定义和流程实例一对多关系。一个流程实例对应多个任务。

[java]  view plain  copy
  1. /** 
  2.  * 启动流程实例 方式一:根据流程定义的ID启动流程实例 方式二:根据流程定义的key启动流程实例(建议使用) 
  3.  * 操作的数据表:act_ru_execution(流程实例表)、act_ru_task(任务表) 
  4.  */  
  5. @Test  
  6. public void test10() {  
  7.     String processDefinitionId = "qjlc:7:1004";// 流程定义ID  
  8.     // 方式一:根据流程定义的ID启动流程实例  
  9.     // ProcessInstance pi =  
  10.     // pe.getRuntimeService().startProcessInstanceById(processDefinitionId);  
  11.     // System.out.println(pi.getId());  
  12.   
  13.     String processDefinitionKey = "qjlc";// 流程定义的key  
  14.     // 方式二:根据流程定义的key启动流程实例(建议使用,会自动选择最新版本)  
  15.     ProcessInstance pi = pe.getRuntimeService().startProcessInstanceByKey(processDefinitionKey);  
  16.     System.out.println(pi.getId());  
  17. }  
  18.   
  19. /** 
  20.  * 查询流程实例 
  21.  */  
  22. @Test  
  23. public void test11() {  
  24.     // 流程实例查询对象,查询表act_ru_execution  
  25.     ProcessInstanceQuery query = pe.getRuntimeService()  
  26.             .createProcessInstanceQuery();  
  27.     List<ProcessInstance> list = query.list();  
  28.     for (ProcessInstance processInstance : list) {  
  29.         System.out.println(processInstance.getId() + " "  
  30.                 + processInstance.getActivityId() + " "  
  31.                 + processInstance.getProcessDefinitionId());  
  32.     }  
  33. }  
  34.   
  35. /** 
  36.  * 删除流程实例 
  37.  */  
  38. @Test  
  39. public void test12(){  
  40.     String processInstanceId = "1601";//流程实例ID  
  41.     String deleteReason = "不请假了";//删除原因  
  42.     pe.getRuntimeService().deleteProcessInstance(processInstanceId, deleteReason);  
  43. }  



 

7.4   查询个人任务

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * 查询个人任务 
  3.  * 操作的数据表:act_ru_task 
  4.  */  
  5. @Test  
  6. public void test13(){  
  7.     //任务查询对象,查询任务表  
  8.     TaskQuery query = pe.getTaskService().createTaskQuery();  
  9.     String assignee = "王五";  
  10.     //添加过滤条件,根据任务的办理人过滤  
  11.     query.taskAssignee(assignee);  
  12.     List<Task> list = query.list();  
  13.     for (Task task : list) {  
  14.         System.out.println(task.getId() + " " + task.getName());  
  15.     }  
  16. }  

 

7.5   办理任务

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * 办理个人任务 
  3.  * 操作数据表:act_ru_task、act_ru_execution 
  4.  */  
  5. @Test  
  6. public void test14(){  
  7.     String taskId = "1902";  
  8.     pe.getTaskService().complete(taskId );  
  9. }  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值