《Drools7.0.0.Final规则引擎教程》之Springboot集成详解编程语言

Springboot与Drools的集成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的初始化配置:

@Configuration public 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启动类

@SpringBootApplication 
public 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.adress 
 import 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") 
@Controller public 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 即可。

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/15205.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论