issue链接
提供规则和脚本节点创建和刷新的回调接口,用户可以实现这些接口,并将其实现类注册到spring容器中,当规则或脚本节点被创建(刷新)后,会执行回调接口中的相应逻辑。

如果想要在所有规则创建之后,执行某些逻辑,可以实现如下接口,并将其注册到spring容器中:

public interface RuleCreatedCallback {
    void afterCreated(RuleArg arg);

    default int getOrder() {
        int h = this.hashCode();
        return this.hashCode()^ (h >>> 16);
    }
}

上面接口中,afterCreated方法是想要在规则创建之后执行的逻辑,其参数中包含了当前创建规则的id以及规则的el表达式

如果想要在所有规则刷新之后,执行某些逻辑,可以实现如下接口,并将其注册到spring容器中:

public interface RuleReloadedCallback {
    void afterReloaded(RuleArg arg);

    default int getOrder() {
        //使用hashcode作为默认order,这样做是为了防止存在多个callback时,order相同导致TreeSet覆盖的问题
        int h = this.hashCode();
        return this.hashCode()^ (h >>> 16);
    }
}

如果想要在所有脚本节点创建之后,执行某些逻辑,可以实现如下接口,并将其注册到spring容器中:

public interface ScriptCreatedCallback {
    void afterCreated(ScriptArg arg);

    default int getOrder() {
        //使用hashcode作为默认order,这样做是为了防止存在多个callback时,order相同导致TreeSet覆盖的问题
        int h = this.hashCode();
        return this.hashCode()^ (h >>> 16);
    }
}

参数ScriptArg中包含了脚本节点的id和脚本内容

如果想要在所有规则刷新之后,执行某些逻辑,可以实现如下接口,并将其注册到spring容器中:

public interface ScriptReloadedCallback {
    void afterReloaded(ScriptArg arg);

    default int getOrder() {
        //使用hashcode作为默认order,这样做是为了防止存在多个callback时,order相同导致TreeSet覆盖的问题
        int h = this.hashCode();
        return this.hashCode()^ (h >>> 16);
    }
}

需要注意的点有:

  • 该特性仅在spring环境(包括springboot)下可用
  • 用户可以实现多个相同的回调函数,如实现多个RuleCreatedCallback,但是这些实现类必须重写getOrder方法,返回各个类的执行顺序,并且各个类的getOrder方法不能返回相同的值,否则会发生互相覆盖。如果有多个相同回调接口的实现类,这些类会按照getOrder返回值从小到大的顺序执行;如果如果有多个相同回调接口的实现类,并且这些类没有重写getOrder方法,那么它们的执行顺序是不可预测的
  • 对于规则的手动刷新,也可以正常触发刷新回调函数;但是如果仅仅刷新一个脚本节点的脚本内容,是不会触发该回调的(即使用下面的方法刷新,不会触发脚本的刷新回调)

ScriptExecutorFactory.loadInstance().getScriptExecutor("groovy").load(nodeId, script);

  • 所有回调函数都会在规则或脚本节点创建(刷新)完成之后被调用