《Drools7.0.0.Final规则引擎教程》之Springboot集成

来源:互联网 发布:保卫萝卜3修改炮塔数据 编辑:程序博客网 时间:2024/05/22 03:35

本来准备按部就班的一章一章更新Drools相关教程,怎奈QQ群组(593177274)有朋友急需Springboot与Drools的集成demo,于是抽出时间写了一个,现在拿出来分享一下。加入群组可免费下载demo,也可以在CSDN下载频道下载:Springboot&Drools demo

pom文件

引入了springboot和drools的依赖,同时引入了kie-spring的集成依赖。

<dependencies>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-web</artifactId>        </dependency>        <dependency>            <groupId>org.kie</groupId>            <artifactId>kie-spring</artifactId>            <version>${drools.version}</version>            <exclusions>                <exclusion>                    <groupId>org.springframework</groupId>                    <artifactId>spring-tx</artifactId>                </exclusion>                <exclusion>                    <groupId>org.springframework</groupId>                    <artifactId>spring-beans</artifactId>                </exclusion>                <exclusion>                    <groupId>org.springframework</groupId>                    <artifactId>spring-core</artifactId>                </exclusion>                <exclusion>                    <groupId>org.springframework</groupId>                    <artifactId>spring-context</artifactId>                </exclusion>            </exclusions>        </dependency>        <dependency>            <groupId>org.drools</groupId>            <artifactId>drools-compiler</artifactId>            <version>${drools.version}</version>        </dependency>    </dependencies>

配置类

基于springboot的初始化配置:

@Configurationpublic class DroolsAutoConfiguration {    private static final String RULES_PATH = "rules/";    @Bean    @ConditionalOnMissingBean(KieFileSystem.class)    public KieFileSystem kieFileSystem() throws IOException {        KieFileSystem kieFileSystem = getKieServices().newKieFileSystem();        for (Resource file : getRuleFiles()) {            kieFileSystem.write(ResourceFactory.newClassPathResource(RULES_PATH + file.getFilename(), "UTF-8"));        }                return kieFileSystem;    }    private Resource[] getRuleFiles() throws IOException {        ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();        return resourcePatternResolver.getResources("classpath*:" + RULES_PATH + "**/*.*");    }    @Bean    @ConditionalOnMissingBean(KieContainer.class)    public KieContainer kieContainer() throws IOException {        final KieRepository kieRepository = getKieServices().getRepository();        kieRepository.addKieModule(new KieModule() {            public ReleaseId getReleaseId() {                return kieRepository.getDefaultReleaseId();            }        });        KieBuilder kieBuilder = getKieServices().newKieBuilder(kieFileSystem());         kieBuilder.buildAll();        return getKieServices().newKieContainer(kieRepository.getDefaultReleaseId());    }    private KieServices getKieServices() {        return KieServices.Factory.get();    }    @Bean    @ConditionalOnMissingBean(KieBase.class)    public KieBase kieBase() throws IOException {        return kieContainer().getKieBase();    }    @Bean    @ConditionalOnMissingBean(KieSession.class)    public KieSession kieSession() throws IOException {        return kieContainer().newKieSession();    }    @Bean    @ConditionalOnMissingBean(KModuleBeanFactoryPostProcessor.class)    public KModuleBeanFactoryPostProcessor kiePostProcessor() {        return new KModuleBeanFactoryPostProcessor();    }}

Springboot启动类

@SpringBootApplicationpublic class SpringBootDroolsApplication {    public static void main(String[] args) {        SpringApplication.run(SpringBootDroolsApplication.class, args);    }}

实体类

public class Address {    private String postcode;    private String street;    private String state;    // 省略getter/setter}

规则返回结果类

public class AddressCheckResult {    private boolean postCodeResult = false; // true:通过校验;false:未通过校验    // 省略getter/setter}

规则文件

package plausibcheck.adressimport com.secbro.model.Address;import com.secbro.model.fact.AddressCheckResult;rule "Postcode should be filled with exactly 5 numbers"    when        address : Address(postcode != null, postcode matches "([0-9]{5})")        checkResult : AddressCheckResult();    then        checkResult.setPostCodeResult(true);        System.out.println("规则中打印日志:校验通过!");end

测试Controller

@RequestMapping("/test")@Controllerpublic class TestController {    @Resource    private KieSession kieSession;    @ResponseBody    @RequestMapping("/address")    public void test(){        Address address = new Address();        address.setPostcode("99425");        AddressCheckResult result = new AddressCheckResult();        kieSession.insert(address);        kieSession.insert(result);        int ruleFiredCount = kieSession.fireAllRules();        System.out.println("触发了" + ruleFiredCount + "条规则");        if(result.isPostCodeResult()){            System.out.println("规则校验通过");        }    }}

启动Springboot项目之后,默认访问http://localhost:8080/test/address 即可。

后语

你的支持是我努力的最大动力!社区的建立离不开你的支持。此系列课程正在持续更新中,相关讨论QQ(593177274)已经建立,欢迎大家加入讨论。如有疑问可以留言也可以发送本人邮箱secbro2@gmail.com。击此处关注Drools博客专栏的持续更新《Drools博客专栏》
这里写图片描述

阅读全文
2 0