Config
规则引擎实例的Config (opens new window) 是一个全局配置。可以通过以下方式修改config:
config := rulego.NewConfig()
ruleEngine, err := rulego.New("rule01", []byte(ruleChainFile), rulego.WithConfig(config))
2
# OnDebug
类型:func(flowType string, nodeId string, msg RuleMsg, relationType string, err error)
- flowType: IN/OUT,流入(IN)该组件或者流出(OUT)该组件事件类型
- nodeId: 节点ID
- msg: 消息结构体,其中消息的msg id是唯一的
- relationType: 如果flowType=IN,则代表上一个节点和该节点的连接关系,例如(True/False);如果flowType=OUT,则代表该节点和下一个节点的连接关系,例如(True/False)
- err: 错误信息
节点调试信息回调全局函数。规则链节点配置设置debugMode=true
后节点的In和Out过程都会触发。可以在该回调函数记录每个节点日志和执行情况,例如:耗时、输入消息和输出消息。
支持动态设置节点的debugMode
字段关闭或者开启。
提示
OnDebug
回调函数里面的自定义逻辑是异步触发的,无法保证执行顺序。
可视化界面参考:
# OnEnd(弃用)
弃用,使用types.WithOnEnd方式
类型:func(msg RuleMsg, err error)
- msg: 结束点组件处理后的msg
- err: 错误信息
规则链执行完成回调全局函数,如果规则链有多个结束点,则执行多次。 例如:执行s1之后同时触发了s2、s3、s4,那么onEnd事件会触发3次,msg是分别s2、s3、s4的执行结果。规则链如下图:
提示
config配置的OnEnd函数是规则链引擎实例全局的。也可以为每条消息配置结束回调函数,使用以下方式:
ruleEngine.OnMsg(msg, types.WithOnEnd(func(ctx types.RuleContext,msg types.RuleMsg, err error) {
//结束回调函数
}))
2
3
如果想在规则链处理完成后执行一次,可以使用以下方式:
ruleEngine.OnMsg(msg,types.WithOnAllNodeCompleted(func() {
//处理完成
}))
2
3
# ScriptMaxExecutionTime
类型:time.Duration
js脚本执行超时时间,默认2000毫秒。
# Pool
类型:types.Pool
协程池接口,如果不配置,则使用 go func 方式。
默认使用内置的pool.WorkerPool
。兼容ants协程池,可以使用ants协程池实现,需要自行引入对应的库。例如:
pool, _ := ants.NewPool(math.MaxInt32)
config := rulego.NewConfig(types.WithPool(pool))
2
提示
内置的pool.WorkerPool
是参考了FastHttp的实现,比ants
性能高和节省内存。
# ComponentsRegistry
类型:types.ComponentRegistry
组件库注册器,默认使用rulego.Registry
# Parser
类型:types.Parser
规则链解析接口,默认使用:rulego.JsonParser
,可以实现自定义规则链DSL。
# Logger
类型:types.Logger
日志记录接口,默认使用:DefaultLogger()
。log组件 使用该记录器。
# Properties
类型:types.Metadata
全局属性,key-value形式。
规则链节点配置可以通过${global.propertyKey}
或者${metadataKey}
方式替换变量的内容。
- 其中
global.
为内置变量,代表从config.Properties中获取内容进行替换(节点初始化时候执行替换逻辑,只执行一次)。 ${metadataKey}
则从消息元数据获取内容进行替换(在节点每次处理消息时执行替换逻辑)。
注意:
${}
内不能出现空格。
提示
另外js脚本运行时也可以获取全局Properties变量值,调用方式:
var value=global.propertyKey;
使用示例参考:node_config (opens new window)
# Udf
类型:map[string]interface{}
注册自定义Golang函数和原生的脚本,脚本引擎运行时可以直接调用。该特性使js、Lua等脚本引擎具备调用Golang函数和扩展原生脚本函数的能力。
示例:
config := rulego.NewConfig()
//在js/lua脚本运行时获取全局变量:global.xx
config.Properties.PutValue("globalValue", "addValueFromConfig")
//注册js自定义函数
config.RegisterUdf("add", types.Script{Type: types.Js, Content: func(a, b int) int {
return a + b
}})
//也可以使用以下方式,注册js自定义函数
config.RegisterUdf("add", func(a, b int) int {
return a + b
})
//注册js函数示例2
config.RegisterUdf("handleMsg", func(msg map[string]interface{}, metadata map[string]string, msgType string) string {
msg["returnFromGo"] = "returnFromGo"
_, ok := rulego.Get("aa")
msg["hasAaRuleChain"] = ok
return "returnFromGoMsgType"
})
//注册Lua自定义函数
config.RegisterUdf("add", types.Script{Type: types.Lua, Content: func(L *lua.LState) int {
a := L.CheckNumber(1)
b := L.CheckNumber(2)
L.Push(lua.LNumber(a + b))
return 1
}})
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
注册原生脚本使用types.Script
把脚本内容封装,默认是Js
类型,示例:
// 使用:utilsFunc.dateFormat(new Date(), "yyyyMMddhh")
config.RegisterUdf(
"utilsFunScript", types.Script{
Type: types.Js,
Content: `var utilsFunc={
dateFormat:function(date,fmt){
var o = {
"M+": date.getMonth() + 1,
/*月份*/ "d+": date.getDate(),
/*日*/ "h+": date.getHours(),
/*小时*/ "m+": date.getMinutes(),
/*分*/ "s+": date.getSeconds(),
/*秒*/ "q+": Math.floor((date.getMonth() + 3) / 3),
/*季度*/ S: date.getMilliseconds() /*毫秒*/,
};
fmt = fmt.replace(/(y+)/, function(match, group) {
return (date.getFullYear() + "").substr(4 - group.length);
});
for (var k in o) {
fmt = fmt.replace(new RegExp("(" + k + ")"), function(match, group) {
return group.length == 1 ? o[k] : ("00" + o[k]).substr(("" + o[k]).length);
});
}
return fmt;
},
isArray:function(arg){
if (typeof Array.isArray === 'undefined') {
return Object.prototype.toString.call(arg) === '[object Array]'
}
return Array.isArray(arg)
},
isObject: function(value){
if (!data || this.isArray(data)) {
return false;
}
return data instanceof Object;
},
isNumber: function(value){
return typeof value === "number";
},
}
`,
},
)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
js脚本中调用:
//调用全局配置参数
var value=global.globalValue;
msg['addField2']=value;
//调用自定义golang函数add
msg['addValue']=add(1,5);
//格式化时间
msg['today']=utilsFunc.dateFormat(new Date(), "yyyyMMddhh");
//调用自定义golang函数handleMsg
msgType=handleMsg(msg,metadata,msgType);
return {'msg':msg,'metadata':metadata,'msgType':msgType};
2
3
4
5
6
7
8
9
10
使用示例参考:node_config (opens new window)
# Aspects
类型:[]Aspect
AOP 切面列表。示例:
//添加组件故障降级切面
config := rulego.NewConfig(
types.WithAspects(&aspect.SkipFallbackAspect{ErrorCountLimit: 3, LimitDuration: time.Second * 10})
)
2
3
4