SpringBoot が easy-rules ルール エンジンを統合するプロセスは何ですか?

王林
リリース: 2023-05-15 16:25:06
転載
1100 人が閲覧しました

1. 概要

設定ファイルにビジネス ルールを設定することで、コードの合理化と保守が可能になり、ルールを変更する場合も設定ファイルのみを変更するだけで済みます。 easy-rules は、Spring の SPEL 式、Apache JEXL 式、MVL 式をサポートするコンパクトなルール エンジンです。

2. プロジェクトに依存関係を追加します

プロジェクトの Gradle に依存関係を追加します。

build.gradle:

plugins {
id 'org.springframework.boot' バージョン '3.0.5'
id 'io.spring.dependency-management ' バージョン '1.1.0'
id 'java'
}

group = 'cn.springcamp'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17 '

configurations {
applyOnly {
extendsFrom annotationProcessor
}
testCompileOnly {
extendsFrom testAnnotationProcessor
}
}

repositories {
mavenCentral()
}

依存関係 {
実装 "org.springframework.boot:spring-boot-starter-json"
実装 'org.springframework.boot:spring-boot -starter-validation'
実装 'org.jeasy:easy-rules-core:4.1.0'
実装 'org.jeasy:easy-rules-spel:4.1.0'
実装 'org. jeasy:easy-rules-support:4.1.0'
annotationProcessor 'org.projectlombok:lombok'
testAnnotationProcessor 'org.projectlombok:lombok'
testImplementation "org.springframework.boot:spring-boot-starter -test"
testImplementation 'org.junit.vintage:junit-vintage-engine'
testImplementation 'org.junit.vintage:junit-vintage-engine'
}

dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependency:2022.0.1"
}
}

test {
useJUnitPlatform()
}

3. 設定ファイル

サンプル プログラムは、ビジネス ルールを設定ファイル (ビジネス ルール設定ファイル (demo-rule.yml) コード:

#) に配置します。
##名前: "年齢ルール"

説明: ""
優先度: 1
条件: "#person.getAdult() == false"
アクション:
- " T( java.lang.System).out.println(\"ショップ: 申し訳ありませんが、アルコールの購入は禁止されています\")"
- "#person.setAdult(true)"
- "#person .setAge (18)"
---
名前: "アルコール ルール"
説明: ""
優先度: 1
条件: "#person.getAdult() == true"
actions:
- "T(java.lang.System).out.println(\"ショップ: アルコールの購入が許可されました\")"

ルール設定ファイル 条件を介して設定し、ルールが満たされると、アクションで設定されたアクションが呼び出されます。

サンプル プロジェクトでは、ルール設定に Spring の SPEL 式を使用しています。設定ファイルには 2 つのルールが設定されています。最初のルールは、

person Spring Bean の getAdult() を介するかどうかを決定します。ルールが満たされ、ルールが満たされると 3 つのメソッドが呼び出されます。

spring-boot 自体の設定ファイルの application.yml にルール ファイルを設定します:

rule:

Skip-on-first-failed-rule: true
最初に適用されたルールをスキップ: false
最初に適用された非トリガールールをスキップ: true
ルール:
- ルール ID: "デモ"
ルール- file-location: "classpath:demo-rule.yml"

4. コードでルール エンジンを設定します。

RuleEngineConfigこの春のルール エンジンを使用してルールを設定します。構成クラス エンジン構成:

@Slf4j
@EnableConfigurationProperties(RuleEngineConfigProperties.class)
@Configuration
public class RuleEngineConfig implements BeanFactoryAware {
    @Autowired(required = false)
    private List<RuleListener> ruleListeners;
    @Autowired(required = false)
    private List<RulesEngineListener> rulesEngineListeners;
    private BeanFactory beanFactory;
    @Bean
    public RulesEngineParameters rulesEngineParameters(RuleEngineConfigProperties properties) {
        RulesEngineParameters parameters = new RulesEngineParameters();
        parameters.setSkipOnFirstAppliedRule(properties.isSkipOnFirstAppliedRule());
        parameters.setSkipOnFirstFailedRule(properties.isSkipOnFirstFailedRule());
        parameters.setSkipOnFirstNonTriggeredRule(properties.isSkipOnFirstNonTriggeredRule());
        return parameters;
    }
    @Bean
    public RulesEngine rulesEngine(RulesEngineParameters rulesEngineParameters) {
        DefaultRulesEngine rulesEngine = new DefaultRulesEngine(rulesEngineParameters);
        if (!CollectionUtils.isEmpty(ruleListeners)) {
            rulesEngine.registerRuleListeners(ruleListeners);
        }
        if (!CollectionUtils.isEmpty(rulesEngineListeners)) {
            rulesEngine.registerRulesEngineListeners(rulesEngineListeners);
        }
        return rulesEngine;
    }
    @Bean
    public BeanResolver beanResolver() {
        return new BeanFactoryResolver(beanFactory);
    }
    @Bean
    public RuleEngineTemplate ruleEngineTemplate(RuleEngineConfigProperties properties, RulesEngine rulesEngine) {
        RuleEngineTemplate ruleEngineTemplate = new RuleEngineTemplate();
        ruleEngineTemplate.setBeanResolver(beanResolver());
        ruleEngineTemplate.setProperties(properties);
        ruleEngineTemplate.setRulesEngine(rulesEngine);
        return ruleEngineTemplate;
    }
    @Bean
    public RuleListener defaultRuleListener() {
        return new RuleListener() {
            @Override
            public boolean beforeEvaluate(Rule rule, Facts facts) {
                return true;
            }
            @Override
            public void afterEvaluate(Rule rule, Facts facts, boolean b) {
                log.info("-----------------afterEvaluate-----------------");
                log.info(rule.getName() + rule.getDescription() + facts.toString());
            }
            @Override
            public void beforeExecute(Rule rule, Facts facts) {
                log.info("-----------------beforeExecute-----------------");
                log.info(rule.getName() + rule.getDescription() + facts.toString());
            }
            @Override
            public void onSuccess(Rule rule, Facts facts) {
                log.info("-----------------onSuccess-----------------");
                log.info(rule.getName() + rule.getDescription() + facts.toString());
            }
            @Override
            public void onFailure(Rule rule, Facts facts, Exception e) {
                log.info("-----------------onFailure-----------------");
                log.info(rule.getName() + "----------" + rule.getDescription() + facts.toString() + e.toString());
            }
        };
    }
    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        this.beanFactory = beanFactory;
    }
}
ログイン後にコピー

Spring Bean

ruleEngineTemplate は構成ファイルで構成され、ルール エンジンの実行は、ruleEngineTemplate を通じてトリガーされます。

5. 実行ルール エンジン

ruleEngineTemplate構成後、ビジネス コードでルール エンジンを実行し、構成ファイルで構成されたビジネス ルールを処理できます:

デモンストレーションとして、ルール エンジンの実行コードを Application の run メソッドに配置します。ルール エンジンはプログラムの開始直後に実行されます:

@SpringBootApplication
public class Application implements CommandLineRunner {
    @Autowired
    RuleEngineTemplate ruleEngineTemplate;
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
    @Override
    public void run(String... args) {
        Person person = new Person();
        Facts facts = new Facts();
        facts.put("person", person);
        ruleEngineTemplate.fire("demo", facts);
    }
}
ログイン後にコピー

プログラムの実行後、次のことができます。コンソールに表示される

を参照してください。 ショップ: 申し訳ありませんが、アルコールの購入は許可されていません 、このコンテンツは "T(java.lang.System).out.println(\"Shop weルール ファイルのアクションで構成されています: 申し訳ありませんが、アルコールの購入は許可されていません\")"。ルールが正常に実行されたことを示します。

以上がSpringBoot が easy-rules ルール エンジンを統合するプロセスは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:yisu.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート