中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么理解java規則引擎

發布時間:2021-11-18 10:13:49 來源:億速云 閱讀:337 作者:iii 欄目:編程語言

本篇內容主要講解“怎么理解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

特點

  • 輕量級框架和易于學習的API

  • 基于POJO的開發和注解的編程模型

  • 支持從簡單規則創建組合規則的能力

  • 支持使用表達式語言(如MVEL和SpEL),最新版本支持JEXL

概念

  • facts 規則引擎輸入

  • rule 規則 rules 規則集合

  • condition 匹配條件

  • action 執行動作

怎么理解java規則引擎

兩種方式定義規則

  • 通過在POJO上添加注釋,以聲明的方式定義

  • 通過RuleBuilder API,以編程方式定義

更多案例可以到這看 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規則引擎”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

容城县| 肇东市| 陆良县| 固阳县| 石楼县| 措勤县| 荥阳市| 安国市| 新丰县| 长乐市| 大足县| 双城市| 黄冈市| 红河县| 广平县| 大余县| 镇宁| 武宁县| 革吉县| 柏乡县| 阿尔山市| 栾川县| 东明县| 兴仁县| 韩城市| 藁城市| 鹤庆县| 罗定市| 河源市| 泗洪县| 兴城市| 扎囊县| 邹平县| 辛集市| 康定县| 鄂托克前旗| 正蓝旗| 灵山县| 吴忠市| 广昌县| 汉川市|