我们知道传统的activiti在其发展的过程中由于部分团队成员关于未来这款开源软件发展意见的分歧,导致分化为多个知名的流程引擎软件,camunda就是其中一条不可多得的团队,作为一个优质的工作流程引擎开源社区,它们被国际多个知名的大型互联网企业用来作为流程审批等服务的底层引擎,同时它提供八种外置的API工具,以及分隔开的BPMN流程画板程序,开发者可以使用自己的UI接入可定制化的流程画板,只需要将此BPMN文件调用远程服务的部署REST-API进行部署即可,这也就制造了我们可以对其进行分布式集群管理的机会。
通过学习camunda流程引擎,你可以得到更深入的对流程引擎相关的理解。你可以得到对国际BPMN规范的理解,你可以对标准化的SOP有逻辑层面上的独特见解。
我将会用自己的浅显易懂的语言与你一同探讨这个深埋谷底的宝藏引擎。
那么我们开始吧!
首先camunda是由Java作为底层语言进行封装与开发的,所以Java语言的掌握是必不可少的。其次由于camunda的前身也是activiti那一套 ,所以我们还是需要掌握对应的规范,流程编辑与节点相应的规范。最后就是英语能稍微cover住即可。
该规范是由OMG组织规定的,主要的目的是既能给用户提供简单的容易理解的流程管理机制、便捷创建流程模型、又能使用户可以很好的处理流程内部的复杂性。最终的做法和很多的规范是相似的,规定一些基础的符号与定义来约束与描述规则,这些元素被用来编排成一套流程模型。
那么简单查看一下这一套符号。
参与者:主要分为泳池与泳道,泳池是某一个需要协作完成打通整个流程的团队,而泳道则是这个团队中各个角色所需要做的事情。
开始事件、结束事件、活动、顺序流。
消息事件与消息流。
排他网关、并行网关、事件网关。
任务(参与者需要完成业务流程目标所需要完成的动作,一个任务只能分配给一条泳道,如果分配多个相同的任务那就可以将这些泳道抽象指定某一个群组)
服务任务(由软件完成、可以是rest调用,也可以是直接调用Java代码)
发送任务(用来将消息发送给其他泳池)
用户任务(通常来说引擎需要得到一个真假的结果,也可以是携带表单等数据的形式确定真假)
业务规则任务、脚本任务、外部任务、接收任务、手工任务等。
Camunda的数据库由48张表组成,下面是这些表的作用简介:
1. ACT_GE_BYTEARRAY:存储流程定义中使用的字节码(例如图片、XML文件等)。
2. ACT_GE_PROPERTY:存储Camunda的版本信息和数据库表的schema版本信息。
3. ACT_GE_SCHEMA_VERSION:存储数据库表的schema版本信息。
4. ACT_IDENTITYLINK:存储用户和组与流程定义、流程实例、任务、评论等实体的关联关系。
5. ACT_RE_DEPLOYMENT:存储流程定义的部署信息,包括部署的流程定义和字节码。
6. ACT_RE_PROCDEF:存储流程定义的信息,包括流程定义的key、版本号、名称等。
7. ACT_RU_EXECUTION:存储流程实例的执行信息,包括流程实例的根执行、当前执行、结束执行等。
8. ACT_RU_JOB:存储异步操作的作业信息,包括定时任务、信令任务等。
9. ACT_RU_TASK:存储任务的信息,包括任务的类型、名称、描述等。
10. ACT_RU_TIMEINST:存储时间实例的信息,包括流程实例的时间信息。
11. ACT_RU_VARIABLE:存储流程实例中的变量信息,包括变量的名称、值等。
12. ACT_HI_ACTINST:存储历史活动实例的信息,包括活动实例的开始、结束时间等。
13. ACT_HI_PROCINST:存储历史流程实例的信息,包括流程实例的开始、结束时间等。
14. ACT_HI_TASKINST:存储历史任务实例的信息,包括任务实例的创建、完成时间等。
15. ACT_HI_VARINST:存储历史变量实例的信息,包括变量实例的创建、更新时间等。
16. ACT_ID_GROUP:存储用户组的信息。
17. ACT_ID_USER:存储用户的信息。
18. ACT_ID_INFO:存储租户的信息。
19. ACT_ID_PRIV:存储用户权限的信息。
20. ACT_ID_PRIV_MAP:存储用户权限与实体之间的映射关系。
21. ACT_ID_REM_TOKEN:存储用户身份令牌的信息。
22. ACT_ID_USER.groups:存储用户所属的用户组。
23. ACT_ID_USER.login_count:存储用户登录次数的信息。
24. ACT_ID_USER.last_login:存储用户最后一次登录的时间。
25. ACT_ID_USER.pwd:存储用户密码的信息。
26. ACT_ID_USER.pwd_reset:存储用户密码重置的信息。
27. ACT_ID_USER.login_lockout:存储用户账户锁定的信息。
28. ACT_ID_USER.login_lockout_expires:存储用户账户锁定过期时间的信息。
29. ACT_ID_USER.login_failed_count:存储用户登录失败的次数。
30. ACT_ID_USER.login_failed_lockout_period:存储用户登录失败锁定周期的信息。
31. ACT_ID_USER.login_failed_last_time:存储用户最后一次登录失败的时间。
32. ACT_ID_USER.login_failed_factor:存储用户登录失败的因素。
33. ACT_ID_GROUP memberships:存储用户组成员的信息。
34. ACT_ID_GROUP.name:存储用户组名称的信息。
35. ACT_ID_GROUP.pwd:存储用户组密码的信息。
36. ACT_ID_GROUP.pwd_reset:存储用户组密码重置的信息。
37. ACT_ID_GROUP.schema_version:存储用户组schema版本号的信息。
38. ACT_ID_GROUP.sub_group:存储用户组子用户组的信息。
39. ACT_ID_GROUP.super_group:存储用户组父用户组的信息。
40. ACT_ID_GROUP.unassigned:存储未分配的用户组。
41. ACT_ID_GROUP.pwd_policy_ref:存储用户组密码策略的引用。
42. ACT_ID_INFO.INFO:存储租户信息。
43. ACT_ID_INFO.PARENT:存储租户的父租户。
44. ACT_ID_INFO.DESCRIPTION:存储租户的描述信息。
45. ACT_ID_INFO.TENANT_ID:存储租户的ID。
46. ACT_ID_INFO.UUID:存储租户的UUID。
47. ACT_ID_INFO.UUID_LOCAL:存储租户的UUID(本地)。
48. ACT_ID_INFO.UUID_GLOBAL:存储租户的UUID(全局)。
下面我们封装最多的服务是持久化仓储服务RepositoryService、运行时流程实例服务RuntimeService、任务服务TaskService三大核心,但是它一共提供了八大服务供开发者进行封装。
接下来主要阐述三大核心使用的服务能力有哪些?
/**
* 仓库服务(更加关注数据库里的数据服务,它强调的是持久化相关服务)
*
* 提供管理流程、流程定义,以及操控流程部署的相关API
* ( 1)查询流程引擎所知道的部署和流程定义。
* ( 2)挂起、激活流程定义。挂起意味着不能进行下一步的流程操作,而激活则是反操作。
* ( 3)获取各种资源,比如部署中包含的文件,或者引擎自动生成的流程图等。
*
* 举例:可传入一个BUMP 2.0 XML文件调用部署API进行部署该流程
*/
//创建一个部署构造器
DeploymentBuilder createDeployment();
//删除部署根据部署实体的ID
void deleteDeployment(String deploymentId);
//删除部署以及部署的关联数据
void deleteDeploymentCascade(String deploymentId);
void deleteDeployment(String deploymentId, boolean cascade);
void deleteProcessDefinition(String processDefinitionId);
void deleteProcessDefinition(String processDefinitionId, boolean cascade);
ProcessDefinitionQuery createProcessDefinitionQuery();
CaseDefinitionQuery createCaseDefinitionQuery();
DecisionDefinitionQuery createDecisionDefinitionQuery();
DeploymentQuery createDeploymentQuery();
void suspendProcessDefinitionById(String processDefinitionId);
void suspendProcessDefinitionById(String processDefinitionId, boolean suspendProcessInstances, Date suspensionDate);
void suspendProcessDefinitionByKey(String processDefinitionKey);
void activateProcessDefinitionById(String processDefinitionId);
void activateProcessDefinitionById(String processDefinitionId, boolean activateProcessInstances, Date activationDate);
void activateProcessDefinitionByKey(String processDefinitionKey, boolean activateProcessInstances, Date activationDate);
/**
* 获取运行时服务 (更加关注的是流程被执行之后在流程实例中的相关服务)
*
* 提供流程实例的相关API
* ( 1)获取与存储流程实例的变量值。
* ( 2)查询流程实例的信息
* ( 3)执行流程实例的操作,比如启动、挂起、激活、删除等。
*/
/**
* 获取任务服务
*
* 需要被用户或者系统执行的任务是流程引擎的核心。围绕着任务的所有资源都被打包在 TaskService
* ( 1)查询分配给用户或组的任务。
* ( 2)创建新的独立任务。这些独立任务是与流程引擎无关的。
* ( 3)控制将任务分配给哪个用户,或者哪些用户,以及以何种方式参与到任务中。
* ( 4)认领并完成一个任务。
* 认领是指某个用户决定承担某个任务,也就是说这个用户会 完成这个任务。
* 完成指的是“做完与这个任务相关的工作”。
* 通常, 认领并完成任务是在填写 某种形式的表单。
*/
```# Camunda流程引擎
### 一、前言
#### 1、学习camunda可以得到什么?
我们知道传统的activiti在其发展的过程中由于部分团队成员关于未来这款开源软件发展意见的分歧,导致分化为多个知名的流程引擎软件,camunda就是其中一条不可多得的团队,作为一个优质的工作流程引擎开源社区,它们被国际多个知名的大型互联网企业用来作为流程审批等服务的底层引擎,同时它提供八种外置的API工具,以及分隔开的BPMN流程画板程序,开发者可以使用自己的UI接入可定制化的流程画板,只需要将此BPMN文件调用远程服务的部署REST-API进行部署即可,这也就制造了我们可以对其进行分布式集群管理的机会。
通过学习camunda流程引擎,你可以得到更深入的对流程引擎相关的理解。你可以得到对国际BPMN规范的理解,你可以对标准化的SOP有逻辑层面上的独特见解。
我将会用自己的浅显易懂的语言与你一同探讨这个深埋谷底的宝藏引擎。
那么我们开始吧!
#### 2、进入camunda的世界你需要了解些什么?
首先camunda是由Java作为底层语言进行封装与开发的,所以Java语言的掌握是必不可少的。其次由于camunda的前身也是activiti那一套 ,所以我们还是需要掌握对应的规范,流程编辑与节点相应的规范。最后就是英语能稍微cover住即可。
### 二、学习BPMN 2.0规范(业务模型与符号)
该规范是由OMG组织规定的,主要的目的是既能给用户提供简单的容易理解的流程管理机制、便捷创建流程模型、又能使用户可以很好的处理流程内部的复杂性。最终的做法和很多的规范是相似的,规定一些基础的符号与定义来约束与描述规则,这些元素被用来编排成一套流程模型。
那么简单查看一下这一套符号。
+ 参与者:主要分为泳池与泳道,泳池是某一个需要协作完成打通整个流程的团队,而泳道则是这个团队中各个角色所需要做的事情。
+ 开始事件、结束事件、活动、顺序流。
+ 消息事件与消息流。
+ 排他网关、并行网关、事件网关。
+ 任务(参与者需要完成业务流程目标所需要完成的动作,一个任务只能分配给一条泳道,如果分配多个相同的任务那就可以将这些泳道抽象指定某一个群组)
+ 服务任务(由软件完成、可以是rest调用,也可以是直接调用Java代码)
+ 发送任务(用来将消息发送给其他泳池)
+ 用户任务(通常来说引擎需要得到一个真假的结果,也可以是携带表单等数据的形式确定真假)
+ 业务规则任务、脚本任务、外部任务、接收任务、手工任务等。
### 三、Camunda核心数据表
```java
Camunda的数据库由48张表组成,下面是这些表的作用简介:
1. ACT_GE_BYTEARRAY:存储流程定义中使用的字节码(例如图片、XML文件等)。
2. ACT_GE_PROPERTY:存储Camunda的版本信息和数据库表的schema版本信息。
3. ACT_GE_SCHEMA_VERSION:存储数据库表的schema版本信息。
4. ACT_IDENTITYLINK:存储用户和组与流程定义、流程实例、任务、评论等实体的关联关系。
5. ACT_RE_DEPLOYMENT:存储流程定义的部署信息,包括部署的流程定义和字节码。
6. ACT_RE_PROCDEF:存储流程定义的信息,包括流程定义的key、版本号、名称等。
7. ACT_RU_EXECUTION:存储流程实例的执行信息,包括流程实例的根执行、当前执行、结束执行等。
8. ACT_RU_JOB:存储异步操作的作业信息,包括定时任务、信令任务等。
9. ACT_RU_TASK:存储任务的信息,包括任务的类型、名称、描述等。
10. ACT_RU_TIMEINST:存储时间实例的信息,包括流程实例的时间信息。
11. ACT_RU_VARIABLE:存储流程实例中的变量信息,包括变量的名称、值等。
12. ACT_HI_ACTINST:存储历史活动实例的信息,包括活动实例的开始、结束时间等。
13. ACT_HI_PROCINST:存储历史流程实例的信息,包括流程实例的开始、结束时间等。
14. ACT_HI_TASKINST:存储历史任务实例的信息,包括任务实例的创建、完成时间等。
15. ACT_HI_VARINST:存储历史变量实例的信息,包括变量实例的创建、更新时间等。
16. ACT_ID_GROUP:存储用户组的信息。
17. ACT_ID_USER:存储用户的信息。
18. ACT_ID_INFO:存储租户的信息。
19. ACT_ID_PRIV:存储用户权限的信息。
20. ACT_ID_PRIV_MAP:存储用户权限与实体之间的映射关系。
21. ACT_ID_REM_TOKEN:存储用户身份令牌的信息。
22. ACT_ID_USER.groups:存储用户所属的用户组。
23. ACT_ID_USER.login_count:存储用户登录次数的信息。
24. ACT_ID_USER.last_login:存储用户最后一次登录的时间。
25. ACT_ID_USER.pwd:存储用户密码的信息。
26. ACT_ID_USER.pwd_reset:存储用户密码重置的信息。
27. ACT_ID_USER.login_lockout:存储用户账户锁定的信息。
28. ACT_ID_USER.login_lockout_expires:存储用户账户锁定过期时间的信息。
29. ACT_ID_USER.login_failed_count:存储用户登录失败的次数。
30. ACT_ID_USER.login_failed_lockout_period:存储用户登录失败锁定周期的信息。
31. ACT_ID_USER.login_failed_last_time:存储用户最后一次登录失败的时间。
32. ACT_ID_USER.login_failed_factor:存储用户登录失败的因素。
33. ACT_ID_GROUP memberships:存储用户组成员的信息。
34. ACT_ID_GROUP.name:存储用户组名称的信息。
35. ACT_ID_GROUP.pwd:存储用户组密码的信息。
36. ACT_ID_GROUP.pwd_reset:存储用户组密码重置的信息。
37. ACT_ID_GROUP.schema_version:存储用户组schema版本号的信息。
38. ACT_ID_GROUP.sub_group:存储用户组子用户组的信息。
39. ACT_ID_GROUP.super_group:存储用户组父用户组的信息。
40. ACT_ID_GROUP.unassigned:存储未分配的用户组。
41. ACT_ID_GROUP.pwd_policy_ref:存储用户组密码策略的引用。
42. ACT_ID_INFO.INFO:存储租户信息。
43. ACT_ID_INFO.PARENT:存储租户的父租户。
44. ACT_ID_INFO.DESCRIPTION:存储租户的描述信息。
45. ACT_ID_INFO.TENANT_ID:存储租户的ID。
46. ACT_ID_INFO.UUID:存储租户的UUID。
47. ACT_ID_INFO.UUID_LOCAL:存储租户的UUID(本地)。
48. ACT_ID_INFO.UUID_GLOBAL:存储租户的UUID(全局)。
下面我们封装最多的服务是持久化仓储服务RepositoryService、运行时流程实例服务RuntimeService、任务服务TaskService三大核心,但是它一共提供了八大服务供开发者进行封装。
接下来主要阐述三大核心使用的服务能力有哪些?
/**
* 仓库服务(更加关注数据库里的数据服务,它强调的是持久化相关服务)
*
* 提供管理流程、流程定义,以及操控流程部署的相关API
* ( 1)查询流程引擎所知道的部署和流程定义。
* ( 2)挂起、激活流程定义。挂起意味着不能进行下一步的流程操作,而激活则是反操作。
* ( 3)获取各种资源,比如部署中包含的文件,或者引擎自动生成的流程图等。
*
* 举例:可传入一个BUMP 2.0 XML文件调用部署API进行部署该流程
*/
//创建一个部署构造器
DeploymentBuilder createDeployment();
//删除部署根据部署实体的ID
void deleteDeployment(String deploymentId);
//删除部署以及部署的关联数据
void deleteDeploymentCascade(String deploymentId);
void deleteDeployment(String deploymentId, boolean cascade);
void deleteProcessDefinition(String processDefinitionId);
void deleteProcessDefinition(String processDefinitionId, boolean cascade);
ProcessDefinitionQuery createProcessDefinitionQuery();
CaseDefinitionQuery createCaseDefinitionQuery();
DecisionDefinitionQuery createDecisionDefinitionQuery();
DeploymentQuery createDeploymentQuery();
void suspendProcessDefinitionById(String processDefinitionId);
void suspendProcessDefinitionById(String processDefinitionId, boolean suspendProcessInstances, Date suspensionDate);
void suspendProcessDefinitionByKey(String processDefinitionKey);
void activateProcessDefinitionById(String processDefinitionId);
void activateProcessDefinitionById(String processDefinitionId, boolean activateProcessInstances, Date activationDate);
void activateProcessDefinitionByKey(String processDefinitionKey, boolean activateProcessInstances, Date activationDate);
/**
* 获取运行时服务 (更加关注的是流程被执行之后在流程实例中的相关服务)
*
* 提供流程实例的相关API
* ( 1)获取与存储流程实例的变量值。
* ( 2)查询流程实例的信息
* ( 3)执行流程实例的操作,比如启动、挂起、激活、删除等。
*/
/**
* 获取任务服务
*
* 需要被用户或者系统执行的任务是流程引擎的核心。围绕着任务的所有资源都被打包在 TaskService
* ( 1)查询分配给用户或组的任务。
* ( 2)创建新的独立任务。这些独立任务是与流程引擎无关的。
* ( 3)控制将任务分配给哪个用户,或者哪些用户,以及以何种方式参与到任务中。
* ( 4)认领并完成一个任务。
* 认领是指某个用户决定承担某个任务,也就是说这个用户会 完成这个任务。
* 完成指的是“做完与这个任务相关的工作”。
* 通常, 认领并完成任务是在填写 某种形式的表单。
*/