1. 引子
kogito是脱胎于jbpm+drools而生的云原生工作流引擎框架。我也不确定这样定义他对不对,不过从目前学习到的内容来看,差不多是这样了。
那通过规则引擎可以做啥呢?比如
- 判断一个人是否成人
- 入参
{ "name": "Adam", "age": 18 }
- 结果
{ "isAdult": true }
- 判断一个数字是素数
- 入参
{ "number": 38 }
- 结果
{ "result": false }
所以通过流程引擎定义业务,结合规则引擎定义条件判断,可以定义从简单到复杂的业务流程。
2. 示例说明
流程图
以下为示例二的流程图,输入一个人的信息,判断是否为成人,是则热行下面的脚本任务,否,则完成上面针对儿童的任务。
判断规则
规则定义是基于drools规则引擎,详细内容我还没学到,先学一个架子,部分语法如包声名、引入类、Java调用都符合java基础语法。
从该示例中可以看出一个规则单元包含了
- 规则说明(规则包、引用、规则名、规则组)
- 条件(when语句块)
- 结论(then语句块)
满足when的条件,则执行then的语句,可以赋值,可以调用java控制台打印。
package org.acme.travels
import org.acme.travels.Person;
rule "Is adult" ruleflow-group "person"
when
$person: Person(age >= 18)
then
modify($person) {
setAdult(true)
};
System.out.println($person.toString())
end
Gateway网关
BPMN中定义了很多种不同的网关,他的作用有些像流程图中的
网关类型
- 排他网关
- 并行网关
- 包容网关
- 事件网关
在本例中,使用到的是第一个排他网关,其逻辑是:
- 后续多个分支中,仅执行满足条件的第一个分支,若没有满足,则执行预先设定的一个Default分支。
因此这个流程中在网关后的两个分支箭头中,会指定条件:
-
判断为小孩
-
判断为成人
3. 示例执行
示例执行非常方便,使用mvn spring-boot:run就可以运行服务并开始测试了。使用Postman调用如下,注意一定要改成Json,这里对应的Header中的Content-Type的值为:”application/json“
- 测试用例为 adam > 18岁
返回值:
{
"id": "85850dfd-176e-4351-9dde-8ae943695dde",
"person": {
"name": "adam",
"age": 19,
"adult": true
}
}
- 测试用例为 Bong < 18岁
{
"person": {
"name":"bong",
"age":16
}
}
返回值:
{
"id": "acabc677-f715-4585-aa50-ac25707e9eb0",
"person": {
"name": "bong",
"age": 16,
"adult": false
}
}
按照流程,当为成人时,会热行一段脚本,在控制台输出内容,而当为小孩时,会有一个用户任务。返回值中的ID,我理解为流程ID,通过这个ID可以查询这个流程下面要进行的任务。比如:
$ curl http://localhost:8080/persons/acabc677-f715-4585-aa50-ac25707e9eb0/tasks
对于上面两个例子,成人输入数据,会自动执行一个脚本,然后结整,小孩的分支,需要完成一个任务,因此后于第二个查询,是有对应的任务数据返回的。
[
{
"id": "0dafe9b9-1f47-407d-b8a1-3f0df3b05c23", //任务ID
"nodeInstanceId": "36e18902-9035-4e27-9d65-f5997bf72e50",
"name": "Task", // 任务名
"state": 0, // 任务状态
"phase": "active",
"phaseStatus": "Ready",
"parameters": {
"Skippable": "false",
"TaskName": "Task",
"NodeName": "Special handling for children"
},
"results": {}
}
]
4. 结束
我还是站在一个流程引擎小白的角度去学习,学记录的。本章没有讲解Drools规则如果定义,也没有详细说明bpmn如何做流程建模,完全是示例中有什么学什么。
因为工作需要,后续会持续记录对于kogito的学习与使用心得。