规则引擎听起来是蛮高深的一个词语,但透过现象看本质,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. 用gogs搭建git服务器

    Gogs 是一款极易搭建的自助 Git 服务. Gogs 的目标是打造一个最简单.最快速和最轻松的方式搭建自助 Git 服务.使用 Go 语言开发使得 Gogs 能够通过独立的二进制分发,并且支持 G ...

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

    20155231 2016-2017-2 <Java程序设计>第1周学习总结 考核方式学习 课前准备 教材学习内容总结 第一章 Java平台概论 了解java 通过学习了解到,java设计 ...

  3. Android开发——LinearLayout和RelativeLayout的性能对比

    0. 前言 我们都知道新建一个Android项目自动生成的Xml布局文件的根节点默认是RelativeLayout,这不是IDE默认设置,而是由android-sdk\tools\templates\ ...

  4. 【LG3320】[SDOI2015]寻宝游戏

    [LG3320][SDOI2015]寻宝游戏 题面 洛谷 题解 不需要建虚树的虚树2333... 贪心地想一下,起始节点肯定是在关键点上,访问顺序就是\(dfs\)序. 那么对于每次询问, \[ An ...

  5. 【LG4585】[FJOI2015]火星商店问题

    [LG4585][FJOI2015]火星商店问题 题面 bzoj权限题 洛谷 \(Notice:\) 关于题面的几个比较坑的地方: "一天"不是一个操作,而是有0操作就相当于一天开 ...

  6. KVM虚拟机无法启动

    一.启动虚拟机报错: [root@KVM ~]# virsh start node-mssql-test01 error: Failed to start domain node-mssql-test ...

  7. Zabbix学习之路(九)之低级自动发现以及MySQL多实例

    1.概述 Zabbix的网络发现是指zabbix server通过配置好的规则,自动添加host,group,template Zabbix的主动注册刚好和网络发现是相反的,功能基本一致.zabbix ...

  8. SimpleDateFormat,Calendar 线程非安全的问题

    SimpleDateFormat是Java中非常常见的一个类,用来解析和格式化日期字符串.但是SimpleDateFormat在多线程的环境并不是安全的,这个是很容易犯错的部分,接下来讲一下这个问题出 ...

  9. DB知识点记录

    DB知识点记录 分页 SqlServer:ROW_NUMBER () over (ORDER BY ID) AS RN, MySql:limit Oracle:ROWNUM AS RN 数据表的基本结 ...

  10. 堆中的路径(MOOC)

    将一系列给定数字插入一个初始为空的小顶堆H[].随后对任意给定的下标i,打印从H[i]到根结点的路径. 输入格式: 每组测试第1行包含2个正整数N和M(≤),分别是插入元素的个数.以及需要打印的路径条 ...