规则引擎-EasyRules

287 阅读1分钟

参考:blog.csdn.net/qq_43472612…

本demo无监听:

package com.winsea.iboot.logic.nice;  
  
import org.jeasy.rules.annotation.*;  
  
/**  
    Rule
**/  
@Rule  
public class FiveSevenRule {  

    // @Condition注解用来标记是否符合规则的方法,这个方法必须是public;  
    //可以有一个或多个带@Fact注解的参数,并返回一个boolean类型。  
    //只有一个方法可以用@Condition注解标记。  
    @Condition  
    public boolean isFiveSevenRule (@Fact("number") Integer number) {  
        return true;  
    }  
    //@Action注解用来标记执行操作的方法,规则可以有多个操作。可以使用order属性以指定的顺序执行操作  
    @Action(order = 1)  
    public void printInput(@Fact("number") Integer number) {  
        System.out.print("能被5和7同时整除的数字");  
    }  
    //规则的优先级 1>2>3>4..以此类推  
    @Priority  
    public int getPriority() {  
        return 3;  
    }  
}
public static void main(String[] args) {  

    // 创建规则引擎  
    RulesEngineParameters parameters = new RulesEngineParameters()  
    .skipOnFirstAppliedRule(true);  

    /**  
    * Easy Rules引擎可以配置以下参数:  
    *  
    * rulePriorityThreshold:当优先级超过指定的阈值时,跳过余下的规则。  
    * skipOnFirstAppliedRule:当一个规则成功应用时,跳过余下的规则。  
    * skipOnFirstFailedRule:当一个规则失败时,跳过余下的规则。  
    * skipOnFirstNonTriggeredRule:当一个规则未触发时,跳过余下的规则。  
    * */  

    /**  
    RulesEngineParameters parameters = new RulesEngineParameters()  
    .rulePriorityThreshold(10)  
    .skipOnFirstAppliedRule(true)  
    .skipOnFirstFailedRule(true)  
    .skipOnFirstNonTriggeredRule(true);  
    */  

    /**  
    从版本3.1开始,Easy Rules提供了RulesEngine接口的两种实现:  
    DefaultRulesEngine:根据规则的自然顺序(默认为优先级)应用规则。  
    InferenceRulesEngine:持续对已知事实应用规则,直到不再应用规则为止。  
    */  
    RulesEngine fizzBuzzEngine = new DefaultRulesEngine(parameters);  

    /**  
    DefaultRulesEngine fizzBuzzEngine = new DefaultRulesEngine(parameters);  
    // 添加监听器  
    fizzBuzzEngine.registerRuleListener(new MyRuleListener());  
    */  

    // 创建规则  
    Rules rules = new Rules();  
    rules.register(new FiveSevenRule());  
    rules.register(new OrtherNumRule());  


    // 触发规则  
    Facts facts = new Facts();  
    for (int i = 1; i <= 100; i++) {  
    facts.put("number", i);  
    fizzBuzzEngine.fire(rules, facts);  
    }  
}

规则2

package com.winsea.iboot.logic.nice;  
  
/**  
* @description:  
* @author: nice  
* @created: 2023/06/12 09:28  
*/  
  
import org.jeasy.rules.annotation.*;  
  
/**  
**/  
@Rule  
public class OrtherNumRule {  

    @Condition  
    public boolean isFiveSevenRule (@Fact("number") Integer number) {  
        return true;  
    }  

    @Action  
    public void printInput(@Fact("number") Integer number) {  
        System.out.print("NICE - number = " + number);  
    }  

    @Priority  
    public int getPriority() {  
        return 2;  
    }  
}