动作库扩展开发

1.内置动作

规则引擎内置动作,详细请参考10.内置动作

2.自定义内置动作

在用户使用过程当中,如果有一些自己内部常用的操作,而这些操作在URule Pro中的内置动作中又没有,那么可以利用自定义内置动作的方式定义自己的内置动作。

定义内置动作非常简单,只需要在需要暴露给用户使用的Spring bean中添加相应的annotation即可。我们先来看看URule Pro中提供的针对字符串的内置动作类的部分源代码。

package com.bstek.urule.runtime.builtinaction;
import com.bstek.urule.model.library.action.annotation.ActionBean;
import com.bstek.urule.model.library.action.annotation.ActionMethod;
import com.bstek.urule.model.library.action.annotation.ActionMethodParameter;
/**
 * @author Jacky.gao
 * @since 2015年11月27日
 */
@ActionBean(name="字符串")
public class StringAction {
    @ActionMethod(name="去空格")
    @ActionMethodParameter(names={"目标字符串"})
    public String trim(String str){
        if(str==null){
            return str;
        }
        return str.trim();
    }

    @ActionMethod(name="指定起始的字符串截取")
    @ActionMethodParameter(names={"目标字符串","开始位置","结束位置"})
    public String substring(String str,int start,int end){
        return str.substring(start, end);
    }
    ......
}

可以看到,首先我们需要在”类“层面添加一个名为ActionBean的annotation,它只有一个属性,就是要定义这个内置动作的名称。然后在需要暴露的方法中添加两个annotation,分别是ActionMethodActionMethodParameter。ActionMethod是用来定义用户看到的方法名称的,而ActionMethodParameter则是用来定义用户看到的各个参数名称,它的names属性是一个数组,要求给出的描述参数要与当前方法的参数个数匹配,如果小于参数个数,那么用户将会看到后面的参数无描述信息。

在类中定义好这些Annotation之后,将这个类配置到Spring当中,让其成为一个标准的Spring Bean,并为其定义一个Bean Id,这样URule在启动时就会自动加载,并让其成为内置动作,用户就可以直接使用了。

  • 定义内置动作的Spring Bean时,一定不要忘记给这个Spring Bean定义一个Id,这样才能保证规则在任何地方运行都不会出错,这点很关键。
  • 在定义内置动作时需要注意,如果我们规则运行方式采用的是客户端服务器模式,那么必须要保证调用知识包的客户端Spring环境里有这个Bean,且Bean的Id要与动作库定义时的Id保证一至,否则调用会出现错误。

3.自定义动作库

3.1 示例代码

/**
 * 自定义动作库
 */
@Component("myAction")
public class MyAction{
    @ExposeAction("判断字符串是不是数字")
    public  boolean isNumber(String str){
       return NumberUtils.isNumber(str);
    }
}

3.2 测试验证

添加动作库

img

在决策集中测试

  • 先导入动作库文件
  • 选择方法 --> 自定义工具 --> 判断字符串是不是数字

img

img

验证结果

img

4.自定义输入值的列表SimpleDataProvider

4.1 示例代码

package com.bstek.demo.test;

import com.bstek.urule.console.SimpleDataProvider;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

/**
 * 自定义输入值,右键选择列表
 */
@Component("TestSimpleDataProvider")
public class TestSimpleDataProvider implements SimpleDataProvider {

    @Override
    public List<String> data() {
        List<String> list=new ArrayList<String>();
        for(int i=0;i<10;i++) {
            list.add("测试"+i);
        }
        return list;
    }

    @Override
    public String name() {
        return "业务数据";
    }

}

4.2 测试验证

在决策中测试

img

验证结果

img

results matching ""

    No results matching ""