使用规则引擎简化特定场景的开发
之前做资金中台的时候,用到了aviator轻量级的规则引擎,简化了匹配逻辑。
前一段开发一个根据获奖规则生成获奖名单的功能,场景比资金路由的匹配要简单,但规则引擎也是适用的。
1. 加入依赖
<dependency><groupId>com.googlecode.aviator</groupId><artifactId>aviator</artifactId><version>5.3.3</version>
</dependency>
2. 新建一个规则工具类
import com.googlecode.aviator.AviatorEvaluator;
import com.googlecode.aviator.Expression;import java.util.HashMap;
import java.util.Map;/*** @author xxx*/
public class RuleExpressionUtils {private RuleExpressionUtils() {}/*** 增长量的规则表达式map*/private static Map<String,Expression> incrementNumExpressionMap = new HashMap<>();/*** 增长率的规则表达式map*/private static Map<String,Expression> incrementRateExpressionMap = new HashMap<>();/*** 根据指标编码获取对应的增长量规则表达式* @param indicator 指标编码* @return 增长量规则表达式*/public static Expression getIncrementNumExpressionByIndicator(String indicator){if(incrementNumExpressionMap.containsKey(indicator)){return incrementNumExpressionMap.get(indicator);}Expression expression = AviatorEvaluator.compile(String.format("double(current.%s)", indicator));incrementNumExpressionMap.put(indicator, expression);return expression;}/*** 根据指标编码获取对应的增长率规则表达式* @param indicator 指标编码* @return 增长率规则表达式*/public static Expression getIncrementRateExpressionByIndicator(String indicator){if(incrementRateExpressionMap.containsKey(indicator)){return incrementRateExpressionMap.get(indicator);}Expression expression = AviatorEvaluator.compile(String.format("double(current.%s)", indicator));incrementRateExpressionMap.put(indicator, expression);return expression;}/*** 计算规则表达式的结果* @param expression 规则表达式* @param dataMap 参数值map* @return 计算结果*/public static Double executeValueExpression(Expression expression, Map<String, Object> dataMap){try{return (Double)expression.execute(dataMap);}catch (Exception e){return null;}}/*** 判断参数是否匹配规则* @param checkRuleExpression 考核规则表达式* @param env 参数值map* @return 匹配结果*/public static boolean invokeCheckRule(Expression checkRuleExpression, Map<String, Object> env){try{return (Boolean) checkRuleExpression.execute(env);}catch (Exception e){return false;}}
}
3. 使用规则工具类进行是否获奖的匹配和奖金的计算
//判断是否匹配规则
boolean isMatch = RuleExpressionUtils.invokeCheckRule(expression, envMap);// 获取规则表达式,并计算奖励金额Expression incrementNumExpression = RuleExpressionUtils.getIncrementNumExpressionByIndicator(indicatorField);Double actualIncrement = (Double) RuleExpressionUtils.executeValueExpression(incrementNumExpression, dataMap);