本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;
}
}