怎么理解java规则引擎

发布时间:2021-11-18 10:13:49 作者:iii
来源:亿速云 阅读:337

本篇内容主要讲解“怎么理解java规则引擎”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么理解java规则引擎”吧!

WHAT

规则引擎由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。接受数据输入。解释业务规则,并根据业务规则作出业务决策。在Java中,大多数的规则引擎都实现JSR94。将规则引擎想象成一个以数据和规则作为输入的系统。他讲这些规则定义为我们提供输出

if x then y

怎么理解java规则引擎

WHY

我们的业务代码里充斥了大量的if/else,当然,我们可以用策略模式+模板模式将if/else抽到各个子类中。但是也增加了类的复杂度。

硬编码

如果需要修改Java类中的逻辑,在更改进入生产环境前,将会精力一个冗长的过程

  1. 硬编码开发

  2. 测试代码

  3. 审核代码

  4. 部署代码

引入规则引擎

服务接口单纯化,将复杂多变的业务逻辑交给比高级语言更加接近自然语言的规则,让用户在web端或cs端自己进行配置发布,将技术和业务逻辑解耦。

常用框架

drools

谷歌出品的规则引擎框架,也是很多公司选型的第一选择。基于Charles Forgy's的RETE算法,易于调整以及易于管理的开源业务规则引擎,符合业内标准、速度快、效率高。业务分析人员或审核人员可以利用给他轻松查看业务规则,检验已编码的规则执行了所需业务规则。一般企业都会做二次开发,并且有web端可视化操作界面。

demo

无spring版本,maven引入drools

<dependency>
	<groupId>org.kie</groupId>
	<artifactId>kie-api</artifactId>
	<version>6.3.0.Final</version>
</dependency>
<dependency>
	<groupId>org.drools</groupId>
	<artifactId>drools-core</artifactId>
	<version>6.3.0.Final</version>
</dependency>
<dependency>
	<groupId>org.drools</groupId>
	<artifactId>drools-compiler</artifactId>
	<version>6.3.0.Final</version>
</dependency>
<dependency>
	<groupId>org.drools</groupId>
	<artifactId>drools-decisiontables</artifactId>
	<version>6.3.0.Final</version>
</dependency>
<dependency>
	<groupId>org.drools</groupId>
	<artifactId>drools-templates</artifactId>
	<version>6.3.0.Final</version>
</dependency>

需要在resources下增加META-INF文件夹,并且创建kmodule.xml声明规则文件的关系

<?xml version="1.0" encoding="UTF-8" ?>
<kmodule xmlns="http://jboss.org/kie/6.0.0/kmoudule">
	<kbase name="rules" packages="rules1">
		<ksession name="ksession-rules" />
	</kbase>
</kmodule>

编写规则文件,在resources下创建rules1文件夹,保证和xml文件中的packages一致。新建rule.drl文件,语法有点类似java,最后还是要转成java的

pacage com.ruleengine.drools
// 导入自定义实体类
import com.ruleengine.drools.Message

// 规则名
rule 'VIP'
	when
	    // 进入条件为 status是VIP,并且把message属性给到printMsg,否则外部无法使用
		m : Message( status == Message.VIP , printMsg : message ) 
	then
		System.out.println( printMsg );
		m.setMessage( "普通用户不打折" );
		m.setStatus( Message.COMMON_USER );
		// 更新实体
		update( m );
end

// 第二个规则
rule "commonUser"
	when
		Message( status == Message.COMMON_USER, printMsg : message )
	then
		System.out.println( printMsg );
end

调用

public class DroolsMain{
	public static void main(String[] args){
		KieServices kieServices = KieServices.Factory.get();
		KieContainer kieContainer = kieServices.getKieClasspathContainer();
		KieSession kSession = kieContainer.newKieSession("ksession-rules");
		Message m = new Message();
		m.setMessage("VIP打折");
		m.setStatus(Message.VIP);
		// 将实体类插入执行规则
		kSession.insert(m);
		kSession.fireAllRules();
	}
}

自定义类

public class Message{
	public static final int VIP - 1;
	public staitc final int COMMON_USER = 0;
	private String message;
	private String status;
	public String getMessage(){return this.message;}
	public int getStatus(){ return this.status; }
	public void setMessage(String message){ this.message = message; }
	public void setStatus(int status){ this.status = status; }
}

特色代表-有赞

有赞最终选择了drools规则引擎来做风控逻辑。用来防御以下风险:

怎么理解java规则引擎

from https://tech.youzan.com/rules-engine/

easyrule

https://github.com/j-easy/easy-rules

特点

概念

怎么理解java规则引擎

两种方式定义规则

更多案例可以到这看 https://github.com/j-easy/easy-rules/tree/master/easy-rules-tutorials

maven引入,最新版本
<dependency>
	<groupId>org.jeasy</groupId>
	<artifactId>easy-rules-core</artifactId>
	<version>4.1.0</version>
</dependency>
POJO
package com.lrq.wechatdemo.rules;
 
import org.jeasy.rules.annotation.Action;
import org.jeasy.rules.annotation.Condition;
import org.jeasy.rules.annotation.Fact;
import org.jeasy.rules.annotation.Rule;
import org.jeasy.rules.support.UnitRuleGroup;

public class RuleClass {
 
    @Rule(priority = 1) //规则设定优先级
    public static class FizzRule {
        @Condition // 返回值为boolean
        public boolean isFizz(@Fact("number") Integer number) {
            return number % 5 == 0;
        }
 
        @Action
        public void printFizz() {
            System.out.print("fizz\n");
        }
    }
 
    @Rule(priority = 2)
    public static class BuzzRule {
        @Condition
        public boolean isBuzz(@Fact("number") Integer number) {
            return number % 7 == 0;
        }
 
        @Action
        public void printBuzz() {
            System.out.print("buzz\n");
        }
    }
 
    public static class FizzBuzzRule extends UnitRuleGroup {
 
        public FizzBuzzRule(Object... rules) {
            for (Object rule : rules) {
                addRule(rule);
            }
        }
 
        @Override
        public int getPriority() {
            return 0;
        }
    }
 
    @Rule(priority = 3)
    public static class NonFizzBuzzRule {
 
        @Condition
        public boolean isNotFizzNorBuzz(@Fact("number") Integer number) {
            // can return true, because this is the latest rule to trigger according to
            // assigned priorities
            // and in which case, the number is not fizz nor buzz
            return number % 5 != 0 || number % 7 != 0;
        }
 
        @Action
        public void printInput(@Fact("number") Integer number) {
            System.out.print(number+"\n");
        }
    }
 
}

调用

import org.jeasy.rules.api.Facts;
import org.jeasy.rules.api.Rules;
import org.jeasy.rules.api.RulesEngine;
import org.jeasy.rules.core.DefaultRulesEngine;
import org.jeasy.rules.core.RulesEngineParameters;
 
public class RuleJavaClient {
    public static void main(String[] args) {
        // 创建规则引擎
        RulesEngineParameters parameters = new RulesEngineParameters().skipOnFirstAppliedRule(true);
        RulesEngine fizzBuzzEngine = new DefaultRulesEngine(parameters);
 
        // 创建规则集并注册规则
        Rules rules = new Rules();
        rules.register(new RuleClass.FizzRule());
        rules.register(new RuleClass.BuzzRule());
        rules.register(new RuleClass.FizzBuzzRule(new RuleClass.FizzRule(), new RuleClass.BuzzRule()));
        rules.register(new RuleClass.NonFizzBuzzRule());
 
        // 执行规则
        Facts facts = new Facts();
        for (int i = 1; i <= 100; i++) {
            facts.put("number", i);
            fizzBuzzEngine.fire(rules, facts);
            System.out.println();
        }
    }
 
}
yml

在resources下新建yml文件

---
name: "fizz rule"
description: "print fizz if the number is multiple of 5"
priority: 1
condition: "number % 5 == 0"
actions:
- "System.out.println(\"fizz\")"
 
---
name: "buzz rule"
description: "print buzz if the number is multiple of 7"
priority: 2
condition: "number % 7 == 0"
actions:
- "System.out.println(\"buzz\")"
 
---
name: "fizzbuzz rule"
description: "print fizzbuzz if the number is multiple of 5 and 7"
priority: 0
condition: "number % 5 == 0 && number % 7 == 0"
actions:
- "System.out.println(\"fizzbuzz\")"
 
---
name: "non fizzbuzz rule"
description: "print the number itself otherwise"
priority: 3
condition: "number % 5 != 0 || number % 7 != 0"
actions:
- "System.out.println(number)"

调用,将yml解析为rules

public class RuleYmlClient {
 
    public static void main(String[] args) throws FileNotFoundException {
        // create a rules engine
        RulesEngineParameters parameters = new RulesEngineParameters().skipOnFirstAppliedRule(true);
        RulesEngine fizzBuzzEngine = new DefaultRulesEngine(parameters);
 
        // load rules from yml
		MVELRuleFactory fuleFactory = new MVELRuleFactory(new YamlRuleDefinitionReader())
        Rules rules = fuleFactory.createRules(new FileReader("rule.yml"));
 
        // fire rules
        Facts facts = new Facts();
        for (int i = 1; i <= 100; i++) {
            facts.put("number", i);
            fizzBuzzEngine.fire(rules, facts);
            System.out.println();
        }
    }
}

URule

国内的规则引擎,和drool一样基于RETE算法建立的。URule Pro是一款由上海锐道信息技术有限公司自主研发的一款纯Java规则引擎,它可以运行在Windows、Linux、Unix等各种类型的操作系统之上; URule Pro的规则设计器采用业内首创的纯浏览器编辑模式,无须安装任何工具,打开浏览器即可完成复杂规则的设计与测试。 怎么理解java规则引擎


旗正规则引擎

旗正规则引擎是由国家科技部和财政部的创新基金支持,专门针对国内规则引擎市场空白的情况,结合国内项目的特点而开发的一款业务规则管理系统(BRMS)产品。规则引擎以规则配置编辑器为规则录入窗口,以规则引擎为系统运转动力,以企业规则库为业务逻辑基础,辅以规则协同管理、远程项目与服务管理、集群规则同步等功能模块,实现业务逻辑的可视化定制,同时又具有快速开发java软件项目的功能

国内比较大的商业级规则引擎,有专用的CS客户端。并且支持规则测试、调用外部规则包、操作数据库、解析excel等骚操作。

怎么理解java规则引擎

到此,相信大家对“怎么理解java规则引擎”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

推荐阅读:
  1. 关于Java规则引擎Easy Rules的用法
  2. java中规则引擎的简介

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java

上一篇:java IO知识点有哪些

下一篇:r语言中散点图怎么画

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》