规则引擎之easyRules
规则引擎听起来是蛮高深的一个词语,但透过现象看本质,Martin Fowler 有如下言:
虽然一个完美的规则引擎不会这么简单,但是如果你只是想要一个够用的规则引擎,这个定义就还蛮清楚的。
public interface IRule {
void setInput(JobEntity jobEntity);
String getDescription();
}
基类有一些基本的实现,注意action和priority的注解:
public abstract class BaseRule implements IRule{
protected JobEntity value;
private String desc;
public BaseRule(String desc){
this.desc = desc;
}
@Override
public String getDescription() {
return desc;
}
@Override
public void setInput(JobEntity jobEntity){
this.value = jobEntity;
}
@Action
public void printWarning(){
System.out.print(....);
}
@Priority
public int getPriority(){
return 1;
}
}
真正的一个实现类,condition的注解用来判断是否触发:
@Rule
public class BlackListUserRule extends BaseRule{
private List<String> blackList = new ArrayList<>(); public BlackListUserRule(RuleItemEntity ruleItemEntity){
super(ruleItemEntity.getDesc()) ; if (ruleItemEntity.getBwType().equalsIgnoreCase(Constants.CHECK_BLACKLIST) &&
ruleItemEntity.getCheckType().equalsIgnoreCase(Constants.CHECK_USER) &&
null != ruleItemEntity.getCheckValue()) {
String[] users = ruleItemEntity.getCheckValue().split(";");
blackList.addAll(Arrays.asList(users));
}
} @Condition
public boolean inBlackList(){
if(blackList.size() == 0){
return false;
} return blackList.contains(value.getUser());
} }
还支持多个规则组成的实现:
public class MultipleRules extends CompositeRule implements IRule{
public MultipleRules(Object... rules){
for (Object rule : rules) {
addRule(rule);
}
}
@Override
public void execute() throws Exception {
super.execute();
System.out.println("CompositeRule reached.");
}
@Override
public void setInput(JobEntity jobEntity) {
if (!rules.isEmpty()) {
for (Rule rule : rules) {
if (rule instanceof IRule) {
IRule iRule = (IRule) rule;
iRule.setInput(jobEntity);
}
}
}
}
}
在建立完rule之后,就是如何使用了
RulesEngine jobRulesEngine= RulesEngineBuilder.aNewRulesEngine().withSkipOnFirstAppliedRule(false)
.withSilentMode(true).build(); for (RuleEntity ruleEntityEnt : ruleEntityEntList) {
IRule rule = RuleFactory.getRule(ruleEntityEnt);
if (null != rule) {
jobRulesEngine.registerRule(rule);
ruleList.add(rule);
}
} for (IRule rule : ruleList) {
rule.setInput(jobEntity);
} jobRulesEngine.fireRules();
上面的代码只是一个示意,稍微改下就可以运行。
别忘了添加依赖:
<dependency>
<groupId>org.easyrules</groupId>
<artifactId>easyrules-core</artifactId>
<version>2.4.0</version>
</dependency> 版本现在好像已经到3.3了 而且改动蛮大 上面的代码在3.3里可能不能运行。
规则引擎之easyRules的更多相关文章
- Java规则引擎 Easy Rules
1. Easy Rules 概述 Easy Rules是一个Java规则引擎,灵感来自一篇名为<Should I use a Rules Engine?>的文章 规则引擎就是提供一种可选 ...
- Scala化规则引擎
1. 引言 什么是规则引擎 一个业务规则包含一组条件和在此条件下执行的操作,它们表示业务规则应用程序的一段业务逻辑.业务规则通常应该由业务分析人员和策略管理者开发和修改,但有些复杂的业务规则也可以由技 ...
- Asp.net 面向接口可扩展框架之业务规则引擎扩展组件
随着面向接口可扩展框架的继续开发,有些功能开发出现了"瓶颈",有太多的东西要写死才好做.但写死的代码扩展性是非常的不好,迷茫中寻找出入... 进而想到我以前开发的好几个项目,都已有 ...
- Atitit.工作流 与 规则引擎
Atitit.工作流 与 规则引擎 1.1. 应用来说,通常分为三部分:界面.业务逻辑和存储1 1.2. 自定义操作系列1 1.3. 自定义按钮系列2 1.1. 应用来说,通常分为三部分:界面.业务逻 ...
- 【java规则引擎】之Drools之Rete算法
一:规则引擎--->规则引擎的核心是Pattern Matcher(模式匹配器).不管是正向推理还是反向推理,首先要解决一个模式匹配的问题.--->对于规则的模式匹配,可以定义为: 一个规 ...
- 规则引擎集成接口(七)规则引擎调用Java类
规则引擎调用Java类 通过myEclipse编写一个简单工程,其中方法是两数相加等到结果,既结果1=输入值1+输入值2.实现规则调用外部接口的方法有三种. 1:接口实例:在myEclipse中制作一 ...
- node(规则引擎)
本文主要记录node的下的一个开源规则引擎nools,给出简单的实例,github地址为: https://github.com/C2FO/nools 定义规则引擎(test.nools) defin ...
- 基于NXBRE规则引擎实现的柔性折扣策略
规则引擎由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策.接受数据输入,解释业务规则,并根据业务规则做出业务决策.应用背景 ...
- BizTalk动手实验(九)业务规则引擎使用
1 课程简介 通过本课程熟悉业务规则引擎(BRE)的使用(本环境为Windows 2008 32位操作系统环境 + Visual Studio 2010 + BizTalk 210) 2 准备工作 1 ...
随机推荐
- Google protobuf使用技巧和经验
Google protobuf是非常出色的开源工具,在项目中可以用它来作为服务间数据交互的接口,例如rpc服务.数据文件传输等.protobuf为proto文件中定义的对象提供了标准的序列化和反序列化 ...
- tarjan强连通模板
#include<stdio.h>//用于求一个图存在多少个强连通分量 #include<string.h> #include<vector> using name ...
- QPushButton槽函数触发两次的问题
以前经常使用qt creator界面管理直接跳转到槽函数没发现这个问题,今天手动写了个槽函数发现按键会触发两次.根据网上的说法是按键会自动连接一个槽函数,如果我们手动添加的槽函数命名规则符合槽函数的命 ...
- 20155216 实验二 Java面向对象程序设计
实验二:Java面向对象程序设计 实验内容 1.初步掌握单元测试和TDD. 2.理解并掌握面向对象的三要素:封装.继承.多态. 3.初步掌握UML建模. 4.熟悉S.O.L.I.D原则. 5.了解设计 ...
- 20155301第十二周java课程程序
20155301第十二周java课程程序 内容一:在IDEA中以TDD的方式对String类和Arrays类进行学习 测试相关方法的正常,错误和边界情况 String类 charAt split Ar ...
- 20155332 2016-2017-2《Java程序设计》第1周学习总结
# 20155332 2016-2017-2<Java程序设计>第1周学习总结 教材学习内容总结 课本提问 1.Java平台概论:为什么需要Java程序设计语言? 2.Java平台概论:版 ...
- # 20155337 2016-2017-2 《Java程序设计》第九周学习总结
20155337 2016-2017-2 <Java程序设计>第九周学习总结 教材学习内容总结 第16章 JDBC(Java DataBase Connectivity)即java数据库连 ...
- 什么是thinkphp
ThinkPHP是一个快速.简单的基于MVC和面向对象的轻量级PHP开发框架,遵循Apache2开源协议发布,从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,尤其注重开发体验 ...
- 成都Uber优步司机奖励政策(4月17日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- day 3 局部变量 全局变量
1.局部变量 2.全局变量(死歌的大招)函数前面声明的都是全局变量 3.全局变量和局部变量的区别 1)老方法 def get_temper(): temper = 33 return temper d ...