002. kogito示例 - 集成Drools规则引擎

1. 引子

kogito是脱胎于jbpm+drools而生的云原生工作流引擎框架。我也不确定这样定义他对不对,不过从目前学习到的内容来看,差不多是这样了。

那通过规则引擎可以做啥呢?比如

  • 判断一个人是否成人
    • 入参
    {
    	"name": "Adam",
    	"age": 18
    }
    
    • 结果
    {
    	"isAdult": true
    }
    
  • 判断一个数字是素数
    • 入参
    {
    	"number": 38
    }
    
    • 结果
    {
    	"result": false
    }
    

所以通过流程引擎定义业务,结合规则引擎定义条件判断,可以定义从简单到复杂的业务流程。

2. 示例说明

流程图

以下为示例二的流程图,输入一个人的信息,判断是否为成人,是则热行下面的脚本任务,否,则完成上面针对儿童的任务。
在这里插入图片描述

判断规则

规则定义是基于drools规则引擎,详细内容我还没学到,先学一个架子,部分语法如包声名、引入类、Java调用都符合java基础语法。
从该示例中可以看出一个规则单元包含了

  1. 规则说明(规则包、引用、规则名、规则组)
  2. 条件(when语句块)
  3. 结论(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中定义了很多种不同的网关,他的作用有些像流程图中的

条件判断

网关类型

  1. 排他网关
  2. 并行网关
  3. 包容网关
  4. 事件网关

在本例中,使用到的是第一个排他网关,其逻辑是:

  • 后续多个分支中,仅执行满足条件的第一个分支,若没有满足,则执行预先设定的一个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的学习与使用心得。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值