Rumah  >  Artikel  >  Java  >  Apakah proses untuk SpringBoot untuk menyepadukan enjin peraturan peraturan mudah?

Apakah proses untuk SpringBoot untuk menyepadukan enjin peraturan peraturan mudah?

王林
王林ke hadapan
2023-05-15 16:25:061083semak imbas

1. Gambaran Keseluruhan

Dengan mengkonfigurasi peraturan perniagaan dalam fail konfigurasi, kod boleh diperkemas dan dikekalkan Apabila peraturan diubah suai, hanya fail konfigurasi yang perlu diubah suai. peraturan mudah ialah enjin peraturan padat yang menyokong ekspresi SPEL musim bunga, serta ekspresi Apache JEXL dan ekspresi MVL.

2. Tambahkan kebergantungan pada projek

Tambah kebergantungan dalam gradle projek.

build.gradle:

pemalam {
id 'org.springframework.boot' versi '3.0.5'
id 'io.spring.dependency-management ' version '1.1.0'
id 'java'
}

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

konfigurasi {
compileOnly {
} extendsFrom annotationProcessor
}
testCompileOnly {
extendsFrom testAnnotationProcessor
}
🎜>

🎜>

mavenCentral()
}

pergantungan {

pelaksanaan "org.springframework.boot:spring-boot-starter-json"
pelaksanaan 'org.springframework.boot:spring- boot -starter-validation'
pelaksanaan 'org.jeasy:easy-rules-core:4.1.0'
pelaksanaan 'org.jeasy:easy-rules-spel:4.1.0'
pelaksanaan '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 {

mengimport {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:2022.0.1"
}
}

ujian {

useJUnitPlatform()
}

3. Fail konfigurasi

Program contoh meletakkan peraturan perniagaan ke dalam fail konfigurasi, kod fail konfigurasi peraturan perniagaan (demo-rule.yml):

nama: "peraturan umur"

huraian: ""
keutamaan: 1
syarat: "#person.getAdult() == false"
tindakan:
- "T( java.lang.System).out.println("Kedai: Maaf, anda tidak dibenarkan membeli alkohol")"
- "#person.setAdult(true)"
- "#person. setAge(18 )"
---
nama: "peraturan alkohol"
huraian: ""
keutamaan: 1
keadaan: "#person.getAdult() == benar"
tindakan :
- "T(java.lang.System).out.println("Kedai: anda kini dibenarkan membeli alkohol")"

Peraturan dalam fail konfigurasi dikonfigurasikan melalui syarat , apabila peraturan dipenuhi, tindakan yang dikonfigurasikan dalam tindakan akan dipanggil.

Projek sampel menggunakan ungkapan SPEL untuk konfigurasi peraturan Dua peraturan dikonfigurasikan dalam fail konfigurasi Peraturan pertama menentukan sama ada peraturan itu dipenuhi melalui getAdult() dalam kaedah

spring bean dipanggil apabila peraturan digunakan. person

Konfigurasikan fail peraturan dalam application.yml dalam fail konfigurasi spring-boot itu sendiri:

peraturan:

skip-on-first-failed-rule: true
skip-on-first-applied-rule: false
skip-on-first-non-triggered-rule: true
rules:
- rule-id: "demo"
rule- lokasi fail: "classpath:demo-rule.yml"

4. Konfigurasikan enjin peraturan dalam kod

Konfigurasikan enjin peraturan melalui kelas konfigurasi spring

: Spring bean RuleEngineConfig dikonfigurasikan dalam fail konfigurasi

@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;
    }
}

dan mencetuskan pelaksanaan enjin peraturan melalui ruleEngineTemplate. ruleEngineTemplate

5. Pelaksanaan enjin peraturan

Selepas konfigurasi, kami boleh melaksanakan enjin peraturan dalam kod perniagaan untuk memproses peraturan perniagaan yang dikonfigurasikan dalam fail konfigurasi: ruleEngineTemplate

adalah yang paling Untuk demonstrasi, kami meletakkan kod pelaksanaan enjin peraturan ke dalam kaedah jalankan Aplikasi Enjin peraturan dilaksanakan serta-merta selepas program dimulakan:

@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);
    }
}

Selepas program dilaksanakan, anda. dapat melihat bahawa

dicetak dalam konsol Kandungan ini sepadan dengan Shop: Sorry, you are not allowed to buy alcohol yang kami konfigurasikan dalam tindakan dalam fail peraturan, menunjukkan bahawa peraturan telah berjaya dilaksanakan. "T(java.lang.System).out.println("Shop: Sorry, you are not allowed to buy alcohol")"

Atas ialah kandungan terperinci Apakah proses untuk SpringBoot untuk menyepadukan enjin peraturan peraturan mudah?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam