初识Drools(二): Drools 之 SpringBoot

11 篇文章 0 订阅
2 篇文章 0 订阅

新启一个SpringBoot项目


项目目录如下:


加入依赖:

<version>6.3.0.Final</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>

编写配置:

package com.example.myDroolsDemo.config;


import org.kie.api.KieBase;
import org.kie.api.KieServices;
import org.kie.api.builder.*;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import org.kie.internal.io.ResourceFactory;
import org.kie.spring.KModuleBeanFactoryPostProcessor;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;

import java.io.IOException;

/**
 * drools配置文件
 *
 * @author <a href="mailto:chenhao2010h@163.com">chenhao</a>
 * @version 1.0.0
 * @since 1.0.0
 * <p>
 * Created at 2018/12/18
 */
@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(() -> 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();
	}
}

其中因为我将drl文件放在了 rules 文件夹下,所以给出了这样的路径,也可以直接放在 resources 文件下修改一下配置中的路径即可


编写POJO:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
    private String name;
    private Integer age;
    private String address;
    private Integer high;
    private Integer householdIncome;
    private Integer family;
}

编写返回类:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class StudentResult {
    private int fraction;
    private int worth;
}

编写简单规则:

package rules


import com.example.myDroolsDemo.pojo.Student;
import com.example.myDroolsDemo.fact.StudentResult
/**
 * 规则
 *
 * @author <a href="mailto:chenhao2010h@163.com">chenhao</a>
 * @version 1.0.0
 * @since 1.0.0
 *
 * Created at 2018/12/18
 */

rule "checkAge"
    when
        student : Student(age < 20)
        studentResult: StudentResult();
    then
        studentResult.setFraction(1);
end

rule "checkHigh"
    when
        student : Student(high < 185)
        studentResult : StudentResult();
    then
        studentResult.setFraction(studentResult.getFraction()+1);
end

rule "checkFamily"
    when
        student : Student(family < 2)
        studentResult : StudentResult();
    then
         studentResult.setFraction(studentResult.getFraction()+1);
    end

rule "final"
    when
        studentResult : StudentResult(fraction>3);
    then
        studentResult.setWorth(100);
end

编写 Controller 层:

@RequestMapping("/test")
@Controller
public class CheckController {
    @Resource
    private KieSession kieSession;

    @RequestMapping("/check")
    @ResponseBody
    public void checkTest() {
        Student student = new Student();
        StudentResult sr = new StudentResult();
        student.setAge(10);
        student.setFamily(1);
        student.setHigh(100);
        kieSession.insert(student);
        kieSession.insert(sr);
        int i = kieSession.fireAllRules();
        System.out.println("触发了" + i + "条规则");

        System.out.println(sr.getWorth());

    }
}

运行后 访问 http://localhost:8080/test/check 

查看控制台

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值