个人博客导航页(点击右侧链接即可打开个人博客):大牛带你入门技术栈
首先看看规则文件大大致样子,
rule "testDrools"
when
...各种条件
then
...执行业务
end
看起来比较像if else,但是切忌,我们应该用一个业务人员的视角而不是一个程序员的视角来看规则文件,否则你会进入很多误区。
当多个工作对象进入规则引擎时,它可以根据多个条件同时判断,并且执行不同的业务代码。
下面有个场景,看看如何把规则引擎应用其中。
假如现在有两组数据对象,分别是现金流数据和账户数据,我们需要根据某个账户在某段时间内的现金流动状况来给账户计算余额。
首先新建现金流对象,账户对象,时间查询对象,分别如下(省去getter setter)
public class CashFlow {
private Date date;
private double amount;
private String type;
private long accountNo;
}
public class Account {
private long accountNo;
private double blance;
}
public class AccountPeriod {
private Date start;
private Date end;
}
我们的目的是根据传入的AccountPeriod对象和一系列CashFlow,Account对象来自动计算出每个Account对象的blance。
规则文件应该如下编写:
package org.drools.examples.cashflow
import org.drools.myTest.cashflow.Account;
import org.drools.myTest.cashflow.AccountPeriod;
import org.drools.myTest.cashflow.CashFlow;
rule "CREDIT"
when
$ap:AccountPeriod()
$acc:Account($accountNo:accountNo)
CashFlow(type=="CREDIT",accountNo==$accountNo,date>=$ap.start && <=$ap.end,$amount:amount)
then
$acc.setBlance($acc.getBlance()+$amount);
System.out.println("借入");
end
rule "DEBITS"
when
$ap:AccountPeriod()
$acc:Account($accountNo:accountNo)
CashFlow(type=="DE