它是什么

        一种工作流引擎,是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<ProcessDefinition> list = processDefinitionQuery.list();
        ProcessDefinition processDefinition = processDefinitionQuery.singleResult();
        System.out.println("=========1" + processDefinition.getId());
        String name = deploy.getName();

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

启动流程实例
Map<String, Object> 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<String, Object> params = new HashMap<>();
        params.put("x", 1);
        List<Task> list = taskService.createTaskQuery().processInstanceId(param).active().list();
        list.forEach(s-> {
            taskService.complete(s.getId());
        });

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

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

到此为止 一个基本的流程就执行成功了
至于什么查询历史等 具体业务再具体查询API即可

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

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

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐