规则引擎开发规范--程序开发类规范<连载2>

1.3.异步调用规则包

通过ruleEngine.excuteSynchronized(String)函数可以异步方式调用规则包。
RuleEngine ruleEngine = RuleEngineFactory.newInstance().getRuleEngine();
ruleEngine.put("export_0", "测试");
try {
ruleEngine.excuteSynchronized("simple.helloworld");
} catch (Exception e) {
e.printStackTrace();
}
异步调用并不能从map中将返回值取回,因此需要通过put方法将对象传给规则包,规则包获得该对象的引用后,直接修改,来实现异步修改值的功能。
执行ruleEngine.excuteSynchronized方法后,系统会生成一个RuleEngineInfo类的实例,然后交给RuleRecordServer类进行执行。RuleRecordServer会根据当前的线程,生成一个新的RuleRecordServer实例,该实例会启动一个RuleRecordServer.ExeThread线程池。
每次执行ruleEngine.excuteSynchronized方法,会从当前线程对应的RuleRecordServer实例中的线程池中,空闲的线程来执行,如果没有空闲的,并且线程池个数小于设置的最大线程数,则会创建一个新的线程,然后来执行。
RuleRecordServer. getInstance().waitThread()可以用于等待所有的子线程执行完毕,调用这个方法时,会判断RuleRecordServer实例的线程池中,是否存在正在执行的线程,如果在执行则当前线程等待,否则继续执行。
RuleRecordServer. getInstance().setMaxThread(int),可以设置线程池的大小。

1.4. 动态参数调用规则包

一般调用规则包时,需要首先知道规则包接收参数的名称,根据参数名称采用put方法传入值;并且需要知道传出参数的名称,根据传出参数采用get方法得到返回值。
缺省的这种调用方式,必须指定了参数名,才能传值。假设我们事先知道传入值的个数和位置,以及知道传出值的个数和位置,就可以直接使用ruleEngine.executeDynamic方法来通过动态参数来调用规则包。
比如test.simpleAdd规则包,其有两个传入参数,和一个传出参数。如图:




如果需要传入两个值、a=11 b=22,然后调用规则包,返回结果值c,那么可以以下方式调用:
RuleEngine ruleEngine = RuleEngineFactory.newInstance().getRuleEngine();
try {
Object[] os = ruleEngine.executeDynamic("test.simpleAdd",new Object[]{11,22});
if ( os != null && os.length > 0 )
System.out.println(os[0]);
} catch (Exception e) {
e.printStackTrace();
}
通过以上代码,无需指定规则包的参数名称,实现调用。
这种调用方式使用时和参数的顺序相关。

猜你喜欢

转载自silencelight.iteye.com/blog/2289567
今日推荐