《Drools7.0.0.Final规则引擎教程》之Springboot集成
2017-07-18 17:30
246 查看
本来准备按部就班的一章一章更新Drools相关教程,怎奈QQ群组(593177274)有朋友急需Springboot与Drools的集成demo,于是抽出时间写了一个,现在拿出来分享一下。加入群组可免费下载demo,也可以在CSDN下载频道下载:Springboot&Drools demo
启动Springboot项目之后,默认访问http://localhost:8080/test/address 即可。
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 即可。
后语
你的支持是我努力的最大动力!社区的建立离不开你的支持。此系列课程正在持续更新中,相关讨论QQ(593177274)已经建立,欢迎大家加入讨论。如有疑问可以留言也可以发送本人邮箱secbro2@gmail.com。击此处关注Drools博客专栏的持续更新《Drools博客专栏》相关文章推荐
- 《Drools7.0.0.Final规则引擎教程》Springboot+规则重新加载
- Drools与Spring Boot集成的HelloWorld项目
- springboot 集成 swagger生成在线文档
- 170712、springboot编程之集成shiro
- Java SpringBoot集成RabbitMq实战和总结
- Spring Boot如何集成duboo服务
- Spring Boot 集成Swagger
- 详解Spring-Boot集成Spring session并存入redis
- Spring Boot 集成Shiro和CAS
- Spring Boot 集成 Mybatis(druid 数据库连接池 以及 分页配置)
- Spring Boot Redis 集成配置
- drools和spring的集成
- Spring BOOT 集成 RabbitMq 实战操作(一)
- 玩转Spring Boot 集成Dubbo
- spring boot集成data-jpa
- springboot 快速集成的一些启动类模块
- 35. Spring Boot集成Redis实现缓存机制【从零开始学Spring Boot】
- Spring boot入门六 服务配置与集成
- 【Demo】springboot微服务+activemq消息中间件集成
- 在前后端分离的SpringBoot项目中集成Shiro权限框架