动作库文件
动作库文件的作用是对配置在spring中的bean方法进行映射,使得我们可以直接在规则当中调用这些方法。同样在项目的“库”节点下创建一个动作库文件,可以看到动作库文件内容有三列,分别是动作名称,bean的id定义列,方法名定义列,以及方法对应的参数定义列,如下图所示:
为了演示这里定义方法的具体操作,下面是一个名为MethodTest的类源码:
package rete.test;
import java.text.SimpleDateFormat;
import java.util.Date;
import com.bstek.urule.model.ExposeAction;
/**
* @author Jacky.gao
* @since 2015年1月14日
*/
public class MethodTest {
@ExposeAction("helloKey")
public String hello(String username){
System.out.println("hello "+username);
return "hello"+username;
}
@ExposeAction("方法1")
public boolean evalTest(String username){
if(username==null){
return false;
}else if(username.equals("张三")){
return true;
}
return false;
}
@ExposeAction("测试Int")
public int testInt(int a,int b){
return a+b;
}
public int testInteger(Integer a,int b){
return a+b*10;
}
@ExposeAction("打印内容")
public void printContent(String username,Date birthday){
SimpleDateFormat sd=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
if(birthday!=null){
System.out.println(username+"今年已经"+sd.format(birthday)+"岁了!");
}else{
System.out.println("Hello "+username+"");
}
}
@ExposeAction("打印Member")
public void printUser(Member m){
System.out.println("Hello "+m.getUsername()+", has house:"+m.isHouse());
}
}
在这个MethodTest类中,我们可以在动作库中需要引用的方法上都添加了一个名为ExposeAction的annotation,它的作用是在定义动作库时,可以通过这个annotation直接选择对应的目标方法。同样我们也看到对于需要在动作库中引用的方法是不需要实现任何接口的,方法签名也是任意的,接下来,我们需要将这个类配置到spring中,让其成为一个标准的bean,spring中的配置如下:
<bean id="methodTest" class="rete.test.MethodTest"></bean>
定义动作库的Bean时,一定不要忘记给Bean定义一个Id,这样才能保证规则在任何地方运行都不会出错,这点很关键。
回到动作库文件编辑器,点击“添加动作”按钮,添加一条Bean定义信息,将"Spring BeanId"属性值改为我们这里的“methodTest”,在当前行上点击右键,在弹出的菜单中选择“根据Spring BeanId选择方法”,如果当前定义的Spring BeanId在当前环境中存在的话,那么弹出 的窗口中会显示出所有添加了ExposeAction的annotation的方法,我们可以根据选择添加即可,可以看到添加的方法会自动将这个方法所需要的参数加载进去,添加成功后,为了在规则中更好的可读性,我们可以修改“动作名称”、“方法名称”以及“参数名称”。
在动作库定义的时候需要注意,如果我们规则运行方式采用的是客户端服务器模式,那么必须要保证调用知识包的客户端Spring环境里有这个Bean,且Bean的Id要与动作库定义时的Id保证一至,否则调用会出现错误。
变量库、参数库、动作库、常量库这些库文件定义好后,就可以在各种类型的规则文件中导入并使用它们。
另外,需要注意的是:在定义动作中,入参是自定义业务对象,在调用时发生argument type mismatch异常信息,需要将java方法的入参类型定义为Object,在方法中通过instanceof判断是否为GeneralEntity。因为在URule Pro中的业务对象,有两种情况:
1.通过java代码生成的,比如session.insert传入的自定义java业务对象,在方法中获取时,类型就是自定义Java业务对象类型。
2.规则编辑器中快速测试时,入参传入的数据,在方法中获取时,类型就是GeneralEntity。