RuleGo RuleGo
🏠首页
  • 快速入门
  • 规则链
  • 标准组件
  • 扩展组件
  • 自定义组件
  • 可视化
  • RuleGo-Server
  • RuleGo-MCP-Server
  • AOP
  • 触发器
  • 高级主题
  • 性能
  • 标准组件
  • 扩展组件
  • 自定义组件
  • 组件市场
  • 概述
  • 快速入门
  • 路由
  • DSL
  • API
  • Options
  • 组件
🔥编辑器 (opens new window)
  • 可视化编辑器 (opens new window)
  • RuleGo-Server (opens new window)
  • ❓问答

    • FAQ
💖支持
👥加入社区
  • Github (opens new window)
  • Gitee (opens new window)
  • GitCode (opens new window)
  • 更新日志 (opens new window)
  • English
  • 简体中文
🏠首页
  • 快速入门
  • 规则链
  • 标准组件
  • 扩展组件
  • 自定义组件
  • 可视化
  • RuleGo-Server
  • RuleGo-MCP-Server
  • AOP
  • 触发器
  • 高级主题
  • 性能
  • 标准组件
  • 扩展组件
  • 自定义组件
  • 组件市场
  • 概述
  • 快速入门
  • 路由
  • DSL
  • API
  • Options
  • 组件
🔥编辑器 (opens new window)
  • 可视化编辑器 (opens new window)
  • RuleGo-Server (opens new window)
  • ❓问答

    • FAQ
💖支持
👥加入社区
  • Github (opens new window)
  • Gitee (opens new window)
  • GitCode (opens new window)
  • 更新日志 (opens new window)
  • English
  • 简体中文

广告采用随机轮播方式显示 ❤️成为赞助商
  • 快速入门

  • 规则链

  • 标准组件

  • 扩展组件

  • 自定义组件

  • 组件市场

  • 可视化

  • AOP

  • 触发器

  • 高级主题

    • Config
      • OnDebug
      • OnEnd(弃用)
      • ScriptMaxExecutionTime
      • Pool
      • ComponentsRegistry
      • Parser
      • Logger
      • Properties
      • Udf
      • Aspects
      • NodeClientInitNow
      • AllowCycle
    • Options
    • 共享数据
    • 执行规则链
    • 组件配置变量
    • 组件连接复用
    • 性能
  • RuleGo-Server

  • 问题

目录

Config

规则引擎实例的Config (opens new window) 是一个全局配置。可以通过以下方式修改config:

config := rulego.NewConfig()
ruleEngine, err := rulego.New("rule01", []byte(ruleChainFile), rulego.WithConfig(config))
1
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 回调函数里面的自定义逻辑是异步触发的,无法保证执行顺序。

可视化界面参考: img

# OnEnd(弃用)

弃用,使用types.WithOnEnd方式

类型:func(msg RuleMsg, err error)

  • msg: 结束点组件处理后的msg
  • err: 错误信息

规则链执行完成回调全局函数,如果规则链有多个结束点,则执行多次。 例如:执行s1之后同时触发了s2、s3、s4,那么onEnd事件会触发3次,msg是分别s2、s3、s4的执行结果。规则链如下图:

img

提示

config配置的OnEnd函数是规则链引擎实例全局的。也可以为每条消息配置结束回调函数,使用以下方式:

ruleEngine.OnMsg(msg, types.WithOnEnd(func(ctx types.RuleContext,msg types.RuleMsg, err error) {
    //结束回调函数 
}))
1
2
3

如果想在规则链处理完成后执行一次,可以使用以下方式:

ruleEngine.OnMsg(msg,types.WithOnAllNodeCompleted(func() {
//处理完成
}))
1
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))
1
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;
1

使用示例参考: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
}})

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";
            },
        }
    `,
},
)
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
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};
1
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})
)
1
2
3
4

# NodeClientInitNow

类型:bool 网络客户端类的组件(例如:mqtt客户端组件、kafka客户端组件等)是否在初始化时候立即初始化。 默认为false,即在第一次调用组件时才初始化。

  • true: 在初始化时候立即初始化,如果初始化失败,则规则链不会启动。
  • false: 在第一次调用组件时才初始化,如果初始化失败,则规则链会启动,但组件调用会失败。

# AllowCycle

类型:bool 是否允许规则链中节点存在循环依赖。默认为false,即不允许。

在 GitHub 上编辑此页 (opens new window)
上次更新: 2025/03/31, 01:52:11
触发器
Options

← 触发器 Options→

Theme by Vdoing | Copyright © 2023-2025 RuleGo Team | Apache 2.0 License

  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式