@Rule(name = "被3整除", description = "number如果被3整除,打印:number is three")
public class ThreeRule {
/**
* Condition:条件判断注解:如果return true, 执行Action
*
* @param number
* @return
*/
@Condition
public boolean isThree(@Fact("number") int number) {
return number % 3 == 0;
}
/**
Action 执行方法注解
@param number */ @Action public void threeAction(@Fact(“number”) int number) { System.out.println(number + " is three"); }
/**
Priority:优先级注解:return 数值越小,优先级越高
@return */ @Priority public int getPriority() { return 1; } }
规则2
@Rule(name = "被8整除")
public class EightRule {
/**
条件
@param number
@return */ @Condition public boolean isEight(@Fact(“number”) int number) { return number % 8 == 0; }
/**
满足条件的动作
@param number */ @Action public void eightAction(@Fact(“number”) int number) { System.out.println(number + " is eight"); }
/**
条件判断的优先级
@return */ @Priority public int getPriority() { return 2; } }
规则3(组合规则-同时执行)
@Rule(name = "被3和8同时整除", description = "这是一个组合规则")
public class ThreeEightRuleUnitGroup extends UnitRuleGroup {
public ThreeEightRuleUnitGroup(Object… rules) { for (Object rule : rules) { addRule(rule); } }
@Override public int getPriority() { return 0; } }
规则4
@Rule(name = "既不被3整除也不被8整除", description = "打印number自己")
public class OtherRule {
@Condition
public boolean isOther(@Fact("number") int number){
return number % 3 != 0 || number % 8 != 0;
}
@Action public void printSelf(@Fact(“number”) int number){ System.out.print(number); }
@Priority public int getPriority(){ return 3; } }
执行规则
public class ThreeEightRuleLauncher {
public static void main(String[] args) { /** * 创建规则执行引擎 * 注意: skipOnFirstAppliedRule意思是,只要匹配到第一条规则就跳过后面规则匹配 */ RulesEngineParameters parameters = new RulesEngineParameters().skipOnFirstAppliedRule(true); RulesEngine rulesEngine = new DefaultRulesEngine(parameters); //创建规则 Rules rules = new Rules(); rules.register(new EightRule()); rules.register(new ThreeRule()); rules.register(new ThreeEightRuleUnitGroup(new EightRule(), new ThreeRule())); rules.register(new OtherRule()); Facts facts = new Facts(); for (int i=1 ; i<=50 ; i++){ //规则因素,对应的name,要和规则里面的@Fact 一致 facts.put(“number”, i); //执行规则 rulesEngine.fire(rules, facts); System.out.println(); } } }
Rule ageRule = new MVELRule()
.name("age rule")
.description("Check if person"s age is > 18 and marks the person as adult")
.priority(1)
.when("person.age > 18")
.then("person.setAdult(true);");
规则2的定义,我们放到alcohol-rule.yml文件中
name: "alcohol rule"
description: "children are not allowed to buy alcohol"
priority: 2
condition: "person.isAdult() == false"
actions:
- "System.out.println("Shop: Sorry, you are not allowed to buy alcohol");"
执行规则
public class ShopLauncher {
public static void main(String[] args) throws Exception {
//创建一个Person实例(Fact)
Person tom = new Person("Tom", 19);
Facts facts = new Facts();
facts.put("person", tom);
//创建规则1
Rule ageRule = new MVELRule()
.name("age rule")
.description("Check if person"s age is > 18 and marks the person as adult")
.priority(1)
.when("person.age > 18")
.then("person.setAdult(true);");
//创建规则2
Rule alcoholRule = new MVELRuleFactory(new YamlRuleDefinitionReader()).
createRule(new FileReader(ResourceUtils.getFile("classpath:alcohol-rule.yml")));
Rules rules = new Rules();
rules.register(ageRule);
rules.register(alcoholRule);
//创建规则执行引擎,并执行规则
RulesEngine rulesEngine = new DefaultRulesEngine();
System.out.println("Tom: Hi! can I have some Vodka please?");
rulesEngine.fire(rules, facts);
System.out.println(JSON.toJSONString(tom));