前言
上一篇学习了基于JavaApi的入门例子,参数主要是通过命令行传入;
这一篇学习下基于REST API的入门例子;
这里我们主要是学习如果使用现有的REST例子,因为官方已经提供了完整版的war包供我们使用
其中使用的流程跟上一篇的基本一致,如下面的目录所示:
目录
- 下载 flowable-rest.war 包
- 启动 flowable-rest 应用
- 部署一个流程定义
- 启动流程实例
- 获取任务列表
- 查询历史记录
正文
1. 下载 flowable-rest.war 包
下载地址:
下载解压后的目录如下所示:flowable-rest.war 就在wars目录中
2. 启动 flowable-rest 应用
进入到wars目录,通过命令行启动:java -jar flowable-rest.war
启动后,显示如下:
当最后一行显示:INFO [main] org.apache.catalina.startup.Catalina.start Server startup in xyz ms
时,说明启动成功
此时我们可以通过一个简单的请求来确认:
curl --user rest-admin:test http://localhost:8080/flowable-rest/service/management/engine
这里所有的请求认证方式都为
basic authentication
用户名/密码:reset-admin/test
返回json对象,内容包括flowable的版本号等,说明启动成功
3. 部署流程定义
下面开始,基本跟上一篇的步骤一致,就是请求方式不同;
上一篇是直接在Java程序中,基于Java API;
这里我们需要把流程定义文件bpmn.xml,先上传到数据库,如下所示:请求格式为 multipart/formdata
curl --user rest-admin:test -F "file=@holiday-request.bpmn20.xml" http://localhost:8080/flowable-rest/service/repository/deployments
下面我们获取流程定义的列表,来查看刚才上传的流程定义:
curl --user rest-admin:test http://localhost:8080/flowable-rest/service/repository/process-definitions
返回的列表中,有一个key为holidayRequest的,就是我们刚才上传的流程定义
我们流程定义中的process id="holidayRequest"
对应的就是这里的key
4. 启动流程实例
启动时,需设定好流程变量;
上一篇是通过命令行输入的,这次我们直接传json对象,如下所示:
curl --user rest-admin:test -H "Content-Type: application/json" -X POST -d '{ "processDefinitionKey":"holidayRequest", "variables": [ { "name":"employee", "value": "John Doe" }, { "name":"nrOfHolidays", "value": 7 }]}' http://localhost:8080/flowable-rest/service/runtime/process-instances
5. 获取任务列表
这里我们查询属于 经理 的任务列表
curl --user rest-admin:test -H "Content-Type: application/json" -X POST -d '{ "candidateGroup" : "managers" }' http://localhost:8080/flowable-rest/service/query/tasks
这里查询到的任务就是流程定义中的如下用户任务:
<userTask id="approveTask" name="Approve or reject request" flowable:candidateGroups="managers"/>
6. 执行用户任务
下面我们就可以调用接口,来执行用户任务;
curl --user rest-admin:test -H "Content-Type: application/json" -X POST -d '{ "action" : "complete", "variables" : [ { "name" : "approved", "value" : true} ] }' http://localhost:8080/flowable-rest/service/runtime/tasks/25
上面请求url中 tasks后面的参数就是 任务id,上面获取任务列表时有返回
执行后,发现报错,如上图所示,提示找不到类;
这个类就是 请求同意后,执行的类,在bpmn.xml中有配置,如下所示:
<serviceTask id="externalSystemCall" name="Enter holidays in external system"
flowable:class="org.flowable.CallExternalSystemDelegate"/>
下面是缺失的类源代码:CallExternalSystemDelegate.java
package org.flowable;
import org.flowable.engine.delegate.DelegateExecution;
import org.flowable.engine.delegate.JavaDelegate;
public class CallExternalSystemDelegate implements JavaDelegate {
public void execute(DelegateExecution execution) {
System.out.println("Calling the external system for employee "
+ execution.getVariable("employee"));
}
}
那怎么添加呢?
这里我们没按照官方的教程,去把缺失的类打包然后部署到lib下(因为遇到了各种各样奇奇怪怪的错误);
而是直接将class文件,部署到war项目中,步骤如下:
- 解压flowable-rest.war:
jar xf .\flowable-rest.war
- 添加缺失的class到org/flowable目录下
- 删除 flowable-rest.war:
rm .\flowable-rest.war
(删除之前记得备份) - 重新打包成jar:
jar cf0M flowable-rest.jar *
- 启动:
java -jar flowable-rest.jar
然后再次访问刚才出错的接口,接口返回200,但是没有返回值;
但是后台有打印日志,如下所示:
这里我的名字有中文(汤圆学Java),所以前面的没打印出来,这个不重要;
至此,一个基于REST API 的请求流程就算告一段落了;
更多的API可以参考官网REST API
总结
本篇主要介绍了通过Rest风格来调用flowable的API,核心流程跟上一篇是一样的;
评论区