浏览 1169 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2016-04-08
通过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(); } 通过以上代码,无需指定规则包的参数名称,实现调用。 这种调用方式使用时和参数的顺序相关。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |