# 规则引擎 ## 介绍 提供可视化,流程化的数据(逻辑)处理工具. ### 场景 待完成.. ## 规则模型 新建规则模型 - 登录物联网管理平台。 - 选择左侧导航栏,选择规则引擎 > 规则模型。 - 在规则模型板块中,单击`新建模型`操作按钮。 - 在弹出设计器中,拖拽节点和连线生成相应规则,填写模型id和名称点击`保存`。 - 规则模型提供配置的导出、导入(支持批量导入)、复制功能 ![新建规则模型](../images/rule-engine/new-rule-model.gif) ### 节点 - 数据的处理逻辑由规则节点执行. 不同的节点类型需要不同的配置. - 节点就像一个java方法,接收上一个节点的参数,处理之后输出到下一个节点. - 节点之间使用`连线`进行连接,组成一个完整到流程. - 节点可以不接收数据,只生产数据.如: `定时任务`,`消息网关`. - 节点可分布在不同的服务器上执行(企业版支持). ### 连线 节点之间通过`连线`连接,`连线`保证多个节点连续执行和有序执行.连线类型分为: `连接`和`事件`. `连接`表示当上一个节点输出数据后,数据会流入下一个节点. `事件`表示当上一个节点触发一下事件时,数据才会流入下一个节点. `连线`可以指定条件,当满足条件表达式时,数据才会流入下一个节点. 条件表达式为`javascript`. 表达式返回`true`则表示满足条件. #### 类型 连线类型分为`连接`和`事件`两种:
- 连接:连线的默认类型,用于连接两个节点。无节点执行状态判断
- 事件:事件类型连线可判断连线后端的节点在连线前端的节点执行之前、执行之后 或是执行失败时进行执行 #### 条件 每一个连线都可以用脚本语言(javascript)配置连接条件,如 `data.type === 1` data为节点内置变量 用于判断上一节点的执行结果是否能启动对应的下一节点执行。默认连接条件为空(连线上一节点 执行完成即执行下一节点) ### 保存,发布 待完成.. ### 内置节点 + 规则引擎每个节点都有一个内置的上下文,该上下文中存储着节点执行的内置变量 + 每个节点可以获取上一节点内置变量和输出自身内置变量到下一节点 + 上一节点输出数据的内置变量名称为 data。 - 如上一节点输出数据为 {"username":"admin","password":"m123"} 则在下一节点可获取的内置变量为 ```json { "data":{ "username":"admin", "password":"m123" }, "username":"admin", "password":"m123" } ``` - 在下一节点中可以用${data.username}或者 ${username} 获取username值admin - ***如上一节点无数据输出,则获取上上一个节点的输出数据内置变量,以此类推直到规则开始节点*** + 节点执行中的事件数据内置变量名称为 attr, ***节点执行错误事件会在当前节点的下个节点执行完成以前清空进而记录下一个节点的错误事件。 换言之:每个节点仅能获取自身上一个节点的错误事件数据。*** 事件类型有如下几种 - start_with: 开始节点事件。${attr[start_with]}:获取开始节点id - end_with: 结束节点事件。${attr[end_with]}:获取结束节点id - error_type: 节点执行错误事件。${attr[error_type]}: 获取节点执行错误类型 - error_message: 节点执行错误事件。${attr[error_message]}: 获取节点执行错误信息 - error_stack: 节点执行错误事件。${attr[error_stack]}: 获取节点执行错误异常 #### 定时任务 定时任务节点用于需要周期性执行某业务规则。如定时同步数据。 ##### 参数说明 | 参数 | 用途 | 是否必须 | 用例| | -------- | :-----: | :----: |:----:| | cron表达式 | 生成定时任务规则 | 是 | cron表达式([在线cron表达式](http://cron.qqe2.com/)) | | 执行参数 | 用于定时任务执行时 | 否 | {} | ##### 内置变量 - 变量说明:节点执行时的当前时间戳 - 获取方式:${data} - 变量类型:时间戳 - 例:该节点执行时间为2019-12-15 00:00:00。则该节点的内置变量如下 ```json { "data": 1576339200000 } ``` #### 消息网关 待完成.. #### 消息通知 通过此节点可调用消息通知组件进行消息发送。 参数说明: | 参数 | 用途 | 是否必须 | 用例 | | -------- | :-----: | :----: | :----: | | 通知类型 | 设置通知类型 | 是 | 短信通知 | | 通知器 | 设置通知类型对应的配置 | 是 | 选择通知器 | | 通知模板 | 设置通知需要发送的内容 | 是 | 选择通知模板 | ::: tip 注意 在通知模版中可使用规则引擎节点的内置变量,具体是否支持需要看通知器实现是否支持. ::: 请参考[根据设备事件通过规则引擎发送钉钉通知](../course/rule-dingding.md) #### MQTT服务 请参考[MQTT客户端](#MQTT客户端) #### MQTT客户端 该节点可以模拟Mqtt客户端消息订阅、消息推送 ##### 参数说明 | 参数 | 用途 | 是否必须 | 用例 | | -------- | :-----: | :----: | :----: | | mqtt客户端 | 设置客户端基本配置 | 是 | 弹出框中选择 | | 操作 | 定义mqtt客户端操作类型 | 是 | 接收设备消息 | | 消息体类型 | 定义mqtt客户端操作推送或订阅的消息类型 | 是 | JSON | | 主题Topic | 定义推送或订阅消息的主题 | 是 | /{productId}/{deviceId}/event/{eventId} | | 主题变量 | 定义推送或订阅消息的主题 | 否 | ${vars.deviceId} | ##### 内置变量 ###### 接收消息 - 变量说明: mqtt客户端接收的消息 - 变量类型:Map - 获取方式:${data.field}或${field} ——field为Map key - 内置变量如下 ```json { "data": { "topic":"/{productId}/{deviceId}/event/{eventId}", //主题topic "will":false, "qos":0, "dup":false, "retain":false, "clientId":"客户端Id", "payloadType":"JSON",//接收消息类型 "payload": { //接收的消息 }, "vars":{//topic占位符变量 "productId":"型号Id", "deviceId":"设备Id", "eventId":"事件Id" } }, "topic":"/{productId}/{deviceId}/event/{eventId}", //主题topic "will":false, "qos":0, "dup":false, "retain":false, "clientId":"客户端Id", "payloadType":"JSON",//接收消息类型 "payload": { //接收的消息 }, "vars":{//topic占位符变量 "productId":"型号Id", "deviceId":"设备Id", "eventId":"事件Id" } } ``` ###### 推送消息 - 变量说明: 推送状态 - 变量类型:Boolean - 获取方式:${data} - 内置变量如下 ```json {"data":true //推送成功状态} ``` #### TCP服务 请参考[TCP客户端](#TCP客户端) #### TCP客户端 该节点可以模拟tcp客户端消息订阅、消息推送 ##### 参数说明 | 参数 | 用途 | 是否必须 | 用例 | | -------- | :-----: | :----: | :----: | | tcp客户端 | 设置客户端基本配置 | 是 | 弹出框中选择 | | 操作 | 定义tcp客户端操作类型 | 是 | 订阅消息 | | 推送消息体类型 | 定义tcp客户端推送的消息类型 | 否 | JSON | | 订阅消息体类型 | 定义tcp客户端订阅的消息类型 | 否 | JSON | ##### 内置变量 ###### 订阅消息 - 变量说明: tcp客户端接收的消息 - 变量类型:Map - 获取方式:${data.field}或${field} ——field为Map key - 内置变量如下 ```json { "data":{ "payloadType":"JSON",//接收消息类型 "payload": { //接收的消息 } }, "payloadType":"JSON",//接收消息类型 "payload": { //接收的消息 } } ``` ###### 推送消息 - 变量说明: 推送状态 - 变量类型:Boolean - 获取方式:${data} - 内置变量如下 ```json {"data":true //推送成功状态} ``` #### SQL 该节点可以模拟数据库sql执行,支持动态选择数据源 ##### 参数说明 | 参数 | 用途 | 是否必须 | 用例 | | -------- | :-----: | :----: | :----: | | 数据源 | 设置sql执行的数据源 | 是 | 默认数据源(服务启动所连接的数据源) | | sql | 定义所选择数据源支持的sql语句 | 是 | select 1 | ##### 内置变量 - 变量说明: Sql执行结果 - 获取方式:如执行sql为 select 1。 则获取方式为${column} #### 转换 该节点可转换数据字段。如 source:a=1 target:b=1 ##### 配置说明 1. 单击转换规则 2. 在弹出框中,单击添加字段 3. 输入原字段、目标字段、类型 + 原字段:需要转换的字段 + 目标字段:转换后生成的字段 + 字段类型: 该字段的数据类型 4. 点击保存生成字段转换配置 ##### 内置变量 1. 变量说明: 字段转换结果与原入参 - 例: 入参: ```json { "a":1, "b":2 } ``` 转换规则: | 原字段 | 目标字段 | 类型 | | :-----: | :-----: | :----: | | a | c | int | - 内置变量为 ```json { "data":{ "a":1, "b":2, "c":1 }, "a":1, "b":2, "c":1 } ``` 2. 获取方式:${data.field} #### 脚本 该节点可执行脚本语言 ##### 参数说明 | 参数 | 用途 | 是否必须 | 用例 | | -------- | :-----: | :----: | :----: | | 脚本语言 | 定于将要执行的脚本语言类型 | 是 | javascript | ###### 脚本内容参数说明 1. 获取上一节点内置参数 - 上一节点内置参数为 ```json { "data":{ "a":1, "b":2, "c":1 }, "a":1, "b":2, "c":1 } ``` - 获取方式 ```js var a = handler.onMessage.a; //a=1 ``` 2. 获取java类 获取方式 ```js var BytesUtils = org.jetlinks.pro.network.utils.BytesUtils; ``` ##### 内置变量 脚本执行结果 ### 调试 - 单击相应的节点,在右侧节点对应的功能表单中,填写好对应的数据。 - 点击运行,填写运行时需要的执行参数。 - 点击确认。 - 在下方日志展示栏中,查看节点对应的调试日志 ## 规则实例 生成规则实例 - 在规则模型列表中,选择对应的模型。 - 在对应的模型列表中,单击操作列中的发布操作,用该规则模型生成规则实例。 ### 查看运行情况 + 点击规则模型列表操作列中的编辑操作 + 在弹出的界面中点击执行按钮 + 点击执行按钮后弹出的界面中选择开始节点、结束节点(开始、结束节点来自于规则 实例中的所有节点,且开始、结束节点可选择相同节点),填写执行参数。单击确认按钮, 在弹窗下方响应栏查看执行结果。 在第二步界面中,选择事件栏查看规则实例所有事件记录。 + 选中规则实例中不同节点用以查看该节点对应的事件记录。 + 选中规则实例页空白处,重新查看该规则实例所有节点事件记录。 ### 查看日志 + 点击规则模型列表操作列中的编辑操作 + 在弹出的界面中点击执行按钮 + 点击执行按钮后弹出的界面中选择开始节点、结束节点(开始、结束节点来自于规则 实例中的所有节点,且开始、结束节点可选择相同节点),填写执行参数。单击确认按钮, 在弹窗下方响应栏查看执行结果。 + 节点执行日志:执行日志主要记录节点在执行过程中的错误信息或主动输出打印的日志信息。
在第二步界面中,选择日志栏查看规则实例所有日志。 + 选中规则实例中不同节点用以查看该节点对应的日志。 + 选中规则实例页空白处,重新查看该规则实例所有节点日志。