动作库扩展开发
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,分别是ActionMethod和ActionMethodParameter。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 测试验证
添加动作库
在决策集中测试
- 先导入动作库文件
- 选择方法 --> 自定义工具 --> 判断字符串是不是数字
验证结果
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 "业务数据";
}
}