1、camunda文档:https://docs.camunda.org/get-started/quick-start/
2、camunda资源下载:https://camunda.com/download/
3、camunda示例github仓库:https://github.com/camunda/camunda-bpm-examples
4、camunda 代码仓库:https://github.com/camunda
5、流程设计器软件camunda modeler下载:https://camunda.com/download/modeler/
6、Java API文档:https://docs.camunda.org/javadoc/camunda-bpm-platform/7.14-SNAPSHOT/
https://docs.camunda.org/manual/7.3/api-references/rest/
7、camunda-SpringBoot: https://docs.camunda.org/manual/develop/user-guide/process-engine/process-engine-api/
8、工作流选型:https://www.cnblogs.com/garfieldcgf/p/13469519.html
Camunda是一个工作流引擎,执行Bpmn2.0标准,因此依赖于基于bpmn的流程图(本质上是一个xml文件)。
Camunda是基于activiti5,所以其保留了PVM。
Camunda从一开始就是为开发人员设计的:
Camunda BPM既可以用作独立的流程引擎服务器,也可以用在自定义Java应用程序中。
Camunda BPM还提供REST API,以便非Java开发人员可以构建连接到远程流程引擎的应用程序。
为了实现高可用性和可伸缩性,Camunda可以依赖于一个共享数据库在分布式集群上运行。
Camunda也照顾业务用户,Camunda BPM为非开发人员提供了广泛的工具:
Camunda使用ISO标准BPMN 2.0定义工作流程,为技术和非技术用户提供通用语言。
Camunda Modeler使业务分析师可以直观地定义工作流,并与开发人员一起协作实际部署。
Camunda Optimize为业务利益相关者提供实时监控和报告,因此不会对流程提出任何疑问。
Camunda还包括决策模型和表示法(DMN)决策引擎,以便业务用户可以定义和维护直接与工作流引擎集成的可执行业务规则。
Camunda BPM是Apache 2.0许可下的开源软件,这意味着您可以直接访问源代码和最小的供应商锁定。
简单的认为就是画的流程图
流程图实例,就是根据某个流程图定义发起了一个新的流程,那么这个新的流程就是一个流程实例
流程的开始和结束节点
任务,当流程流转到某个阶段,需要用户审核或者其他操作的时候,这个需要用户来完成的操作就是一个任务,除了用户任务之外,还有系统任务等其他任务
如果需要让某个用户执行某个任务,首先需要将任务分配给用户,一般有3种分配方式
直接指定,这里通过Assignee来直接指定某一个具体的用户(一般是用户ID或者唯一的用户名),支持表达式以支持动态指定
指定候选人,通过candidateUser来指定一系列候选人,如果是多个用户,通过,号分隔
指定候选组,通过candidateGroup来指定某一个组里面的所有用户(实际测试中,发现候选人和候选组是并集关系)
如果指定了候选人和候选组,那么并不意味着所有的候选人都需要执行任务,这些人首先需要进行一个认领的操作,一个任务只能由一个人认领,认领完成后才能执行任务,相对的,也可以取消认领
简而言之就是流程图的箭头,配合Gateway使用的时候,还可以在箭头上指定表达式,用于控制流向
SequenceFlow的表达式依赖于流程变量,流程变量通过 流程启动、完成任务来传递
网关,条件判断流程图流向,一般有Inclusive Gateway、Exclusive Gateway和Parallel Gateway
排他网关
排他网关可以有多个流出,但最终只能选择一条路径
并行网关
并行网关可以有多个流出,并且每个流出都会被执行(忽略表达式),当每个流出都执行完毕之后,才进行下一步流转,并行网关的流入和流出的标识是相同的,例如
ProcessEngine 核心接口,提供了工作流所有的操作的api。
1、RuntimeService 用于开启流程实例、删除流程实例、以及搜索流程实例等操作
2、TaskService 用于用户任务的认领、完成、分发等操作
3、IdentityService 用于提供身份认证以及管理用户和用户组
4、HistoryService 用于查询历史流程实例、历史任务以及历史流程变量等
5、FormService 用户内外联表单的渲染、通过提交表单开启流程实例、通过提交表单完成任务等
新增一个流程定义和更新一个流程定义是同样的方法(更新的时候请保持processDefinitionKey不变)
@Autowired ProcessEngine engine ;
engine.getRepositoryService().createDeployment() .addString(resource.getName() + ".bpmn", resource.getXml()) .deploy();
但是更新一个流程并非我们认为的更新,而是一个重新部署,事实上ProcessDefinition的id已经变了,因此如果我们通过如下方法查询流程定义:
processEngine.getRepositoryService().createProcessDefinitionQuery().active().list()
会查出来两个同样的流程定义,但事实上另一个重复的是我们更新的流程定义,如果只想显示最新的一个,查询语句上 加上 latestVersion() 这个即可,顺便说下通过定义id和定义key来启动流程的区别:
如果通过processDefinitionId来启动一个流程,那么代表启动流程定义的某一个版本,如果通过processDefinitionKey来启动流程,那么将会始终启动流程定义的最新版本。
有时候我们需要在部署直接做一些校验,那么可以利用下面这个静态方法:
BpmnModelInstance modelInstance = Bpmn.readModelFromStream(is)
通过BpmnModelInstance我们可以做一些简单或者深入的判断,比如判断流程有没有结束事件:
modelInstance.getModelElementsByType(EndEvent.class).isEmpty()
判断启动任务有没有设置表单:
Collection startEvents = modelInstance.getModelElementsByType(StartEvent.class); for (StartEvent startEvent : startEvents) { Collection flows = startEvent.getIncoming(); if (flows.isEmpty()) { if (StringUtils.isEmpty(startEvent.getCamundaFormKey())) { //提醒用户设置启动表单 } } }