Skip to end of metadata
Go to start of metadata

URule2技术交流QQ群及在线体验示例

在线体验示例:http://112.124.15.63:8084/为了不同用户操作互不影响,需要注册账号登录体验操作。

URule2技术交流QQ群:423339793

URule2规则引擎产品教学视频:https://pan.baidu.com/s/1oAeJeCM,密码:evsk


       当我们把规则相关资源文件打成知识包后,我们就可以在业务代码当中通过相关API调用这个知识包,然后将外部相关业务数据插入到引擎中进行计算。在URule当中,通过com.bstek.urule.runtime.service.KnowledgeService接口可获取指定的资源包ID对应的构建好的资源包信息,该接口源码如下所示:

KnowledgeService接口源码

       可以看到,这个接口中有两个方法可供使用,一个是给一个资源ID(格式为:projectName/packageId)返回一个对应的KnowledgePackage对象;另一个是给一个或多个知识包ID,返回一个集合类型的KnowledgePackage对象。在URULE当中,对于一个知识包,在使用时引擎会将其构建成KnowledgePackage对象,在这个KnowledgePackage对象中包含了所有由向决策集、决策表、决策树、评分卡、决策流等文件构建的RuleSet(规则集)对象,以及由规则流构成的FlowDefinition对象。

资源包ID规范

在使用getKnowledge方法获取某个指定的package时,要给一个资源包ID,需要注意的是资源包的ID在定义要要包含资源包所在项目名称,格式为:projectName/packageId

       通过KnowledgeService接口获取到KnowledgePackage对象后,接下来就可通过KnowledgePackage对象创建com.bstek.urule.runtime.KnowledgeSession对象,这个对象就是引擎提供的与业务数据交互的接口,通过这个接口,可将需要的业务数据对象插入到引擎当中,最后根据需要执行规则或规则流。

KnowledgeSession

       可以看到KnowledgeSession接口扩展自WorkingMemory接口,WorkingMemory接口源码如下:

WorkingMemory接口源码

       要通过KnowledgePackage对象或这个对象的数组创建一个KnowledgeSession对象,可以通过com.bstek.urule.runtime.KnowledgeSessionFactory类中下面两个静态方法实现:

KnowledgeSessionFactory类源码

       由于这两个方法都是静态方法,所以可以直接调用,下面的代码中演示了完整的调用过程:

知识包调用示例

       在上面的示例当中,获取到KnowledgeSession对象后,向其中插入一个名为Employee业务数据对象,这样引擎在计算时,会直接采用Employee中相关数据,如有条件满足,同时有对Employee中相关数据赋值,那么会直接反映到当前插入的这个Employee对象当中。

       在实际使用中,可能还会向KnowledgeSession中添加参数数据(以Map形式添加),对应URule中的参数库文件中定义的信息,引擎计算完成后,我们要通KnowledgeSession中的getParameter来获取具体的参数对象,而不 能通过原添加的Map中获取,如下代码:

获取计算后的参数值的方法

       从上面的代码中可以看到,在规则计算完成后,在获取计算后的参数中的result值时,我们并没有用提供参数的parameter,而是通过KnowledgeSession的getParameter来实现,这是因为在向KnowledgeSession设置参数时,引擎会将参数中所有的值取出并放入到引擎中内置的一个Map中,以避免影响原参数的值。所以计算完成后,我们要通过KnowledgeSession的getParameter来获取计算后的参数值。

       如果我们的资源包中包含有规则流,那么在插入好相关业务数据对象后,可以通过KnowledgeSession中提供的startProcess来实现规则流的调用,如下面的代码所示:

规则流调用示例

       在URule当中,规则流中是不存在人工任务的,也就是说规则流的执行是一次性完成的,这点与包含人工任务的工作流引擎不同,比如UFLO,在UFLO中有人工任务,所以开启流程实例后可能需要多次完成人工任务才能完成一个流程实例。

       实际业务当中,我们除了会做单条规则计算外,还有可能需要运行规则引擎来处理一大批数据,这些数据可能有几万条,几十万条,甚至更多。在这种情况下,如果我们还是采用普通的KnowledgeSession在一个线程里处理大批量数据的话,那么就会需要很长的时间才能可能将这几十万条甚至更多的数据处理完成,在这个时候,为了充分利用服务器较强的CPU性能,我们可以使用BatchSession利用多线程并行处理这些数据。顾名思义BatchSession是用来做批处理任务的会话对象,它是 URULE当中提供的多线程并行处理大批量业务数据的规则会话对象。

       要得到一个BatchSession对象,我们也需要提供一个或多个KnowledgePackage对象,获取KnowledgePackage对象的方法与上面介绍的方法相同,有了KnowledgePackage对象后,就可以利用KnowledgeSessionFactory类创建一个BatchSession对象。

       在com.bstek.urule.runtime.KnowledgeSessionFactory类中除上面提到的两个构建KnowledgeSession的静态方法外,还提供了另外八个可用于构建BatchSession的静态方法,其源码如下:

KnowledgeSessionFactory中创建BatchSession的方法

       BatchSession接口比较简单,它只定义了两个方法:

BatchSession接口方法

       可以看到,它可以接收若干个名为com.bstek.urule.runtime.Business接口实例,Business接口比较简单,它只有一个方法:

Business接口源码

       在Business实现类中,我们的业务写在execute方法当中,在这个方法中,只有一个KnowledgeSession对象,这个session对象就是我们与规则引擎操作的对象,示例代码如下:

BatchSession用法示例

生产环境下urule.knowledgeUpdateCycle参数配置

在生产环境当中,我们的规则并不会经常发生变化,所以客户端在运行时没有必要每次都从服务端获取最新的规则包信息,这时我们可以通过添加一个名为urule.knowledgeUpdateCycle参数来控制客户端每隔多久要检查客户端缓存的规则包文件是否在服务端有更新。urule.knowledgeUpdateCycle参数默认值为0,表示客户端每次运行时都会到服务端检查有没有更新当前规则包,这种配置在开发的时候是没有问题的,但在生产环境下,因为每次调用检查服务端是否有更新,非常的耗时,所以在生产环境下,我们需要配置urule.knowledgeUpdateCycle参数,其值单位为毫秒,如urule.knowledgeUpdateCycle=100000则表示客户端的调用时会每隔100秒到服务端检查是否有更新,依次类推。如果设置urule.knowledgeUpdateCycle=1,那么客户端则只会采用本地缓存的规则外信息(如果本地缓存有的话),无论什么时候都不会检查服务端是否有更新,这种配置较适合压力测试的情形,因为这种情况下是不会更新规则包的。

Labels
  • No labels