工作流之Camunda开发记录(一)----常用API与流程
发布日期:2021-05-06 19:33:10 浏览次数:21 分类:技术文章

本文共 3036 字,大约阅读时间需要 10 分钟。

它是什么

一种工作流引擎,是Activiti的变种,他怎么来的其他很多地方有介绍 我不怎么关心

做什么

我本次记录的是作为工作流引擎使用 进行二次封装开发 只用他的一个壳子        具体流程是:       1、前端传他自己的Json结构。当然必要时需要添加后端定制化的东西       2、后端解析为Camunda识别的Json结构       3、解析中需要通过camunda 的 用户任务与服务任务调用自己业务的逻辑       4、发布流程定义       5、启动流程实例

日常API使用与名词介绍

准备工作
1、首先我使用的是Springboot+Camunda 启动时加上注解即可使用 在主类 + @EnableProcessApplication     当然依赖也不能少 我使用的是Gradle开发依赖是最新版的     compile group: 'org.camunda.bpm.springboot', name: 'camunda-bpm-spring-boot-starter-webapp', version: '7.14.0'     使用maven的同学可以自己再找哈 这个没啥难度     2、想要后端自己测试 可以下载一个官方画图插件 Camunda-modeler      地址为:      https://github.com/camunda/camunda-modeler/releases     3、画图插件使用很简单啦 简单的画图随便看看就会了
API介绍
流程定义发布
1、上面的准备工作做完了 启动boot工程 第一次比较慢 会自动生成47张表 这个我几乎不关心 因为我用我自己的业务流程 只是用它的壳子而已       2、我们先拿到一个简单的XML结构:

3、这里的xml有几种形式可以使用
我只说两种
a、文件形式 文件必须以bpmn20.xml结尾
b、字符串形式 没有什么过多要求 名称必须是bpmn内的名称统一
拿到xml结构我们就可以进行发布了 发布后得到的对象我们称之为流程定义 这一步很重要

// 之前我们已经在主类加了注解的话 这里直接通过Spring注入RepositoryService对象就可以使用 之后关于camunda的所有的Service 同理// 字符串发布 s1则为xml格式字符串Deployment deploy = repositoryService.createDeployment().addString("demo1.bpmn20.xml", s1).deploy();// 文件发布 其中param 是文件的路径信息Deployment deploy = repositoryService.createDeployment().addInputStream("bpmnProcessId",new FileInputStream(param)).deploy();

通过以上两种方式 我们都可以成功进行发布 这里发布失败会有提示

在我的使用过程中 我总结了几点会遇到的错误
1、bpmn文件中的id 必须以字母开头 不能以数字开始
2、若为文件发布 则文件名称必须以bpmn20.xml结尾,否则即使发布成功也不会生成流程定义,在启动实例时会报错说找不到定义
3、end是必要的但不是必须的、若没有end 我经历过启动无限循环跳不出的情况 找不到结束了嘛

这里我们还需要拿到一个发布后的id

ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery().deploymentId(deploy.getId());        List
list = processDefinitionQuery.list(); ProcessDefinition processDefinition = processDefinitionQuery.singleResult(); System.out.println("=========1" + processDefinition.getId()); String name = deploy.getName();

这样就可以拿到流程定义id 了 如果 到这里还没有报错 就基本是发布成功了

启动流程实例
Map
params = new HashMap<>(); DemoParam demoParam1 = new DemoParam(); DemoParam demoParam2 = new DemoParam(); DemoParam demoParam3 = new DemoParam(); params.put("s1", demoParam1); params.put("s2", demoParam2); params.put("s3", 2); ProcessInstance processInstance = runtimeService.startProcessInstanceById(param, params); String id = processInstance.getId();

启动流程是可以加入全局参数的 具体参数的使用 请看我关于服务任务的介绍。

这里的param是上面的流程定义id
这步还没有报错的话 就启动成功并且拿到了实例id
所谓的流程实例就是流程定义启动后的东西 注意一个定义可以发布多个实例
这里要提到任务种类、所谓的任务就是一个正方形 可以执行任务的种类、服务任务是自动执行的,用户任务是需要审批执行的,所以如果遇到的用户任务 任务是中止 需要审批才会继续执行

审批方法

Map
params = new HashMap<>(); params.put("x", 1); List
list = taskService.createTaskQuery().processInstanceId(param).active().list(); list.forEach(s-> {
taskService.complete(s.getId()); });

当然审批过程中也可以继续在全局变量中添加参数

全局参数很重要 关系到我们以后的业务流程怎么添加参数 怎么使用参数 因为工作流是自动执行的 所以参数是在启动任务流程之前就设置好的东西

到此为止 一个基本的流程就执行成功了

至于什么查询历史等 具体业务再具体查询API即可

下面简单介绍一下其他名词

任务节点:包括用户任务、服务任务、子任务等
序列流:即为线
网关:即为分叉 网关本身没有什么业务意义,只作为条件判断的一个标识、网关后的序列流可以添加条件表达式用作判断依据

如果还想知道什么Camunda其他的知识、可以留言与我分享讨论

上一篇:工作流之Camunda开发记录(二)---- 用户任务、服务任务、全局变量的使用
下一篇:ClickHouse (一) ------Mac下的安装

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2025年03月29日 13时13分40秒