规则引擎听起来是蛮高深的一个词语,但透过现象看本质,Martin Fowler 有如下言:

You can build a simple rules engine yourself. All you need is to create a bunch of objects with conditions and actions, store them in a collection, and run through them to evaluate the conditions and execute the actions.

虽然一个完美的规则引擎不会这么简单,但是如果你只是想要一个够用的规则引擎,这个定义就还蛮清楚的。

同样就有人根据这个想法,已经实现了一个简单的规则名字,easyRules,好吧,名字也是简单。下面我们就看看如何使用这个规则引擎。
首先还是先定义了一个接口,这个不是必须的,只是为了后续使用方便:
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的更多相关文章

  1. Java规则引擎 Easy Rules

    1.  Easy Rules 概述 Easy Rules是一个Java规则引擎,灵感来自一篇名为<Should I use a Rules Engine?>的文章 规则引擎就是提供一种可选 ...

  2. Scala化规则引擎

    1. 引言 什么是规则引擎 一个业务规则包含一组条件和在此条件下执行的操作,它们表示业务规则应用程序的一段业务逻辑.业务规则通常应该由业务分析人员和策略管理者开发和修改,但有些复杂的业务规则也可以由技 ...

  3. Asp.net 面向接口可扩展框架之业务规则引擎扩展组件

    随着面向接口可扩展框架的继续开发,有些功能开发出现了"瓶颈",有太多的东西要写死才好做.但写死的代码扩展性是非常的不好,迷茫中寻找出入... 进而想到我以前开发的好几个项目,都已有 ...

  4. Atitit.工作流 与 规则引擎

    Atitit.工作流 与 规则引擎 1.1. 应用来说,通常分为三部分:界面.业务逻辑和存储1 1.2. 自定义操作系列1 1.3. 自定义按钮系列2 1.1. 应用来说,通常分为三部分:界面.业务逻 ...

  5. 【java规则引擎】之Drools之Rete算法

    一:规则引擎--->规则引擎的核心是Pattern Matcher(模式匹配器).不管是正向推理还是反向推理,首先要解决一个模式匹配的问题.--->对于规则的模式匹配,可以定义为: 一个规 ...

  6. 规则引擎集成接口(七)规则引擎调用Java类

    规则引擎调用Java类 通过myEclipse编写一个简单工程,其中方法是两数相加等到结果,既结果1=输入值1+输入值2.实现规则调用外部接口的方法有三种. 1:接口实例:在myEclipse中制作一 ...

  7. node(规则引擎)

    本文主要记录node的下的一个开源规则引擎nools,给出简单的实例,github地址为: https://github.com/C2FO/nools 定义规则引擎(test.nools) defin ...

  8. 基于NXBRE规则引擎实现的柔性折扣策略

    规则引擎由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策.接受数据输入,解释业务规则,并根据业务规则做出业务决策.应用背景 ...

  9. BizTalk动手实验(九)业务规则引擎使用

    1 课程简介 通过本课程熟悉业务规则引擎(BRE)的使用(本环境为Windows 2008 32位操作系统环境 + Visual Studio 2010 + BizTalk 210) 2 准备工作 1 ...

随机推荐

  1. Linux系统下连接校园网Drcom客户端教程(广东工业大学)

    这篇教程写给想要学习Linux系统或者在Linux系统下有需要使用Drcom上网的同学,在我疯狂踩坑,经过n多次的刷机装机实验,体验不同发行版本的linux系统后,终于懂得怎么连接上drcom,想想连 ...

  2. 20155211 2016-2017-2 《Java程序设计》第2周学习总结

    20155211 2016-2017-2 <Java程序设计>第2周学习总结 教材学习内容总结 通过对教材的阅读,我理解到Java中对于整数,浮点数等类型的定义与c语言基本相同. 对字面常 ...

  3. C语言 迭代部分的代码编写

    C语言代码学习 迭代部分 迭代要用到函数部分的知识,一开始我写了计算n!的计算,代码和运行结果如下: 结果只能单一的计算出整数内的值,如果输入负值则结果为返回值1,显然是不对的,根据查书学习以后,知道 ...

  4. 20155301 2016-2017-2 《Java程序设计》第2周学习总结

    20155301 2016-2017-2 <Java程序设计>第2周学习总结 教材学习内容总结 教材的第三章内容主要分为两大方面: 一.程序中的数据类型,变量和运算符,主要讲述了各种类型的 ...

  5. [CF1042D] Petya and Array

    题面 题解 这道题目到底叫什么好呢?? 史上最短CDQ分治题 记一个前缀和,然后CDQ分治即可. 代码 #include<cstdio> #include<algorithm> ...

  6. 【LOJ121】「离线可过」动态图连通性

    [LOJ121]「离线可过」动态图连通性 题面 LOJ 题解 线段树分治的经典应用 可以发现每个边出现的时间是一个区间 而我们每个询问是一个点 所以我们将所有边的区间打到一颗线段树上面去 询问每个叶子 ...

  7. asp.net core 2.2 根据PC端和移动端自动显示不同视图而不改变url地址

    1.添加HttpRequest扩展方法 public static class RequestExtensions { //regex from http://detectmobilebrowsers ...

  8. css布局笔记(一)

    布局方式 一列布局 通常固定宽高,用margin:0 auto:居中显示 两列布局 说起两列布局,最常见的就是使用float来实现.float浮动布局的缺点是浮动后会造成文本环绕等效果,以及需要及时清 ...

  9. linux部署MantisBT(一)部署apache

    一.部署apache 1.下载apache安装包及依赖包 http://httpd.apache.org/download.cgi#apache24(apache2)http://apr.apache ...

  10. POJ 3278 Catch That Cow (附有Runtime Error和Wrong Answer的常见原因)

    题目链接:http://poj.org/problem?id=3278 Catch That Cow Time Limit: 2000MS   Memory Limit: 65536K Total S ...