规则引擎听起来是蛮高深的一个词语,但透过现象看本质,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. 两组数据的均值是否具有显著差异的T检验

    最近在做分析的时候,遇到了T检验,然而对于没有统计学背景的人来说完全不知如何下手 当然了,遇到问题第一反应就是百度. 果然百度出来了很多链接,当时第一次直接选择了用Excel去做T检验.下面是源数据 ...

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

    20155318 2016-2017-2 <Java程序设计>第四周学习总结 教材学习内容总结 一.继承 1.父类:为了改进代码,可以将多个代码中相同的部分提升为父类,其他类只需用exte ...

  3. java Hibernate UUID代码

    package mypack; import java.io.Serializable; import java.net.InetAddress; /** * 唯一主键生成办法.从Hibernate中 ...

  4. 【转载】D3D深度测试和Alpha混合

    原文:D3D深度测试和Alpha混合 1.       深度测试 a)         深度缓冲区:屏幕上每个像素点的深度信息的一块内存缓冲区.D3D通过比较当前绘制的像素点的深度和对应深度缓冲区的点 ...

  5. CF 1037 D. Valid BFS?

    D. Valid BFS? http://codeforces.com/contest/1037/problem/D 题意: 给一个序列,一棵树,判断能否bfs这棵树,得到这个序列. 分析: 将每个点 ...

  6. 深入浅出之-route命令实战使用指南

    本博文的视频讲解已发布:http://oldboy.blog.51cto.com/2561410/1119453 缘起:本文为老男孩linux培训第七次课前考试题及参考答案,有朋友在看完http:// ...

  7. 问题:python2.7 安装包失败,提示错误:Microsoft Visual C++ 9.0 is required (Unable to find vcvarsall.bat)

    问题描述: 使用pip安装包时报错,error: Microsoft Visual C++ 9.0 is required (Unable to find vcvarsall.bat) 环境: pyt ...

  8. git分支在团队中的使用

    须知 在介绍分支常用操作之前 我们需要知道几点: 1.主干不允许做任何修改结构或者业务的操作. 有两种情况可以修改主干: 就是当前主干已经是有问题的,合并后出问题发布不了. 修改与业务无关的配置文件, ...

  9. jenkens其实是代码上传工具

    Jenkins 持续集成使用教程 用 jenkins 有什么好处 通过规范化来完成,简单,繁琐,浪费时间的重复工作 规范化工作,以免出现低级错误 实现随时随地任何人一键构建 ...... 安装 jen ...

  10. Android 不同分辨率下调整界面

    Android Settings中有修改Disaply size的界面,通过修改Display size,能够修改屏幕分辨率. 由于修改了屏幕分辨率,有可能导致同一界面在不同的分辨率下显示出错(内容显 ...