一、引入Jar包,配置POM文件
二、更详细的语法
三、表达式语法介绍
最简单完成的一个规则,语法也要包含这些
rule "name"
when
。。。。。。
then
。。。。。。
end
案例1
rule "withdraw 11"
agenda-group "trade.withdraw"
enabled true
salience 11
when
$routeResult: RouteResult()
$request: WithdrawRouteRuleRequest()
$payer: RouteRuleRequestAccount(accountType == "AAA" && fundPlSettleModel == "BBB") from $ request.getPayer()
then
logger.info("{}匹配到规则,返回场景编码{}",$request.getIdempotenceNo(),"trade.withdraw.1001");
$routeResult.setResult(true);
$routeResult.setBusinessScenariosCode("trade.withdraw.1001");
end
rule “withdraw 11” rule表示这是一个规则,规则名叫withdraw 11
1、salience
用来设置规则执行的优先级,salience属性的值是一个数字,数字越大执行优先级越高,同时它的值可以是一个负数。默认情况下,规则的ssalience 默认值为0,所以如果我们不手动设置规则的salience 属性,那么它的执行顺序是随机(但是一般都是按照加载顺序。)
2、enabled
enabled 属性比较简单,它是用来定义一个规则是否可用的。该属性的值是一个布尔值,默认该属性的值为true,表示规则是可用的,如果手工为一个规则添加一个enabled属性,并且设置其enabled 属性值为false,那么引擎就不会执行该规则
3、agenda-group
引擎在调用这些设置了agenda-group 属性的规则的时候需要显示的指定某个Agenda Group 得到Focus(焦点),比如下面代码
//getSession 获取KieSession 的方法自己写的。
KieSession ks = getSession();
//设置agenda-group 的auto-focus使其执行
ks.getAgenda().getAgendaGroup("group1").setFocus();
注:对规则名过滤,只执行某个规则名下面的规则
kSession.fireAllRules(new RuleNameEqualsAgendaFilter("man"))
//【man】是规则名,也就是rule "man"
案例2
rule "withdraw 11"
agenda-group "trade.withdraw"
enabled true
salience 11
when
$routeResult: RouteResult() //判断内存中必须有RouteResult类型对象
$request: WithdrawRouteRuleRequest() //判断内存中必须有WithdrawRouteRuleRequest类型
//$request.getPayer() 表示上面定义的变量$request对象有一个变量payer
//payer对象必须是RouteRuleRequestAccount类型,payer对象里面的属性accountType
$payer: RouteRuleRequestAccount(accountType == "A" && fundPlSettleModel == "B")
from $request.getPayer()
then
logger.info("{}匹配到规则,返回场景编码{}",$request.getIdempotenceNo(),"trade.withdraw.1001");
$routeResult.setResult(true);
$routeResult.setBusinessScenariosCode("trade.withdraw.1001");
end
1、from
from的作用:指定左边作为它的源,作为右边表达式要用到的变量。下面举一个例子也说一下,from的用法。
RouteRuleRequest routeRuleRequest = new RouteRuleRequest ();
kieSession.insert(routeRuleRequest );
//往kieSession里面设置了一个routeRuleRequest 类型的对象,或者说往工作内存设置对象。
##判断是否包含TransferRouteRuleRequest类型的对象,如果有赋值给$request这个变量。
$request: RouteRuleRequest ()
$receiver: RouteRuleRequestAccount(accountType == 1) from $request.getReceiver()
上面这段代码的意思,从$request里面取一个【属性变量receiver】,然后赋值给左边表达式,也就是赋值给下面这段代码
$receiver: RouteRuleRequestAccount(accountType == 1)
左边再判断这个变量receiver是否是RouteRuleRequestAccount类型,并且里面的属性accountType是否等于1, 再把这个结果给到$receiver这个变量。
案例3
$request: TransferRouteRuleRequest()
$modeType: TransferRouteRuleRequest(modeType == 2)
$platform: TransferRouteRuleRequest(isSamePlatform == 1)
TransferRouteRuleRequest括号判断数据,可以写多行,默认是and拼接
四、操作List
kieSession.insert(list); //往工作内存设置集合
##规则处理:打印出所有List集合中的元素
rule "hello_0"
when
$li:List(size > 0) ##依次获取工作内存中的所有List集合给$li
$m:Animal(name == "cat") from $li ##获取List中name = "cat" 的Animal对象,可能会有多个,可能只有一个。
then
##依次打印当前List中的message
##注意,这里会被多次执行,执行次数为所有List集合元素总数(注意不是当前List集合总数)
##因为规则从工作内存中筛选出一条完全符合conditions的数据,都会在agenda中插入一个规则与匹配数据的组合,再由agenda负责执行规则。
System.out.println("id:"+$m.getId()+",name:"+$m.getName());
end