网站首页 > 开源技术 正文
规则引擎Drools语法
(1)规则文件构成
在使用Drools时非常重要的一个工作就是编写规则文件,通常规则文件的后缀为.drl。
drl是Drools Rule Language的缩写。在规则文件中编写具体的规则内容。
一套完整的规则文件内容构成如下:
关键字 | 描述 |
package | 包名,只限于逻辑上的管理,同一个包名下的查询或者函数可以直接调用 |
import | 用于导入类或者静态方法 |
global | 全局变量 |
function | 自定义函数 |
query | 查询 |
rule end | 规则体 |
Drools支持的规则文件,除了drl形式,还有Excel文件类型的。
(2)规则体语法结构
规则体是规则文件内容中的重要组成部分,是进行业务规则判断、处理业务结果的部分。
规则体语法结构如下:
rule:关键字,表示规则开始,参数为规则的唯一名称。
attributes:规则属性,是rule与when之间的参数,为可选项。
when:关键字,后面跟规则的条件部分。
LHS(Left Hand Side):是规则的条件部分的通用名称。它由零个或多个条件元素组成。如果LHS为空,则它将被视为始终为true的条件元素。
then:关键字,后面跟规则的结果部分。
RHS(Right Hand Side):是规则的后果或行动部分的通用名称。
end:关键字,表示一个规则结束。
(3)注释
在drl形式的规则文件中使用注释和Java类中使用注释一致,分为单行注释和多行注释。
单行注释用"//"进行标记,多行注释以"/*"开始,以"*/"结束。如下示例:
Drools与springboot的整合开发
(1)创建maven工程,配置pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<!-- drools规则引擎 -->
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-core</artifactId>
<version>7.6.0.Final</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-compiler</artifactId>
<version>7.6.0.Final</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-templates</artifactId>
<version>7.6.0.Final</version>
</dependency>
<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-api</artifactId>
<version>7.6.0.Final</version>
</dependency>
<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-spring</artifactId>
<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>
<version>7.6.0.Final</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
(2)配置application.properties文件
server.port=8080
spring.application.name=springboot-drools
(3)创建规则文件/resources/rules/helloworld.drl
package rules
rule "rule_hello_world"
when
eval(true)
then
System.out.println("规则:rule_helloworld触发...");
end
(4)编写初始化配置类DroolsConfig
@Configuration
public class DroolsConfig {
//指定规则文件存放的目录
private static final String RULES_PATH = "rules/";
private final KieServices kieServices = KieServices.Factory.get();
@Bean
@ConditionalOnMissingBean
public KieFileSystem kieFileSystem() throws IOException {
KieFileSystem kieFileSystem = kieServices.newKieFileSystem();
ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
Resource[] files = resourcePatternResolver.getResources("classpath*:" + RULES_PATH + "*.*");
String path = null;
for (Resource file : files) {
path = RULES_PATH + file.getFilename();
kieFileSystem.write(ResourceFactory.newClassPathResource(path, "UTF-8"));
}
return kieFileSystem;
}
@Bean
@ConditionalOnMissingBean
public KieContainer kieContainer() throws IOException {
KieRepository kieRepository = kieServices.getRepository();
kieRepository.addKieModule(kieRepository::getDefaultReleaseId);
KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem());
kieBuilder.buildAll();
return kieServices.newKieContainer(kieRepository.getDefaultReleaseId());
}
@Bean
@ConditionalOnMissingBean
public KieBase kieBase() throws IOException {
return kieContainer().getKieBase();
}
@Bean
@ConditionalOnMissingBean
public KModuleBeanFactoryPostProcessor kiePostProcessor() {
return new KModuleBeanFactoryPostProcessor();
}
}
(5)创建RuleService类
@Service
public class RuleService {
@Autowired
private KieBase kieBase;
public void rule(){
KieSession kieSession = kieBase.newKieSession();
kieSession.fireAllRules();
kieSession.dispose();
}
}
(6)创建Controller类
@RestController
public class HelloController {
@Autowired
private RuleService ruleService;
@GetMapping("/hello/rule")
public String rule(){
ruleService.rule();
return "OK";
}
}
(7)创建启动类DroolsApplication
案例:个人所得税计算
计算规则
要实现个人所得税计算器,需要了解如下计算规则:
实现步骤:
(1)编写实体类Calculation
@Data
public class Calculation {
private double wage;//税前工资
private double wagemore;//应纳税所得额
private double cess;//税率
private double preminus;//速算扣除数
private double wageminus;//扣税额
private double actualwage;//税后工资
}
(2) 在resources/rules下创建规则文件calculation.drl文件
import com.itheima.drools.entity.Calculation
rule "个人所得税:计算应纳税所得额"
enabled true
salience 3
no-loop true
date-effective "2011-09-01" //生效日期
when
$cal : Calculation(wage>0)
then
$cal.setWagemore($cal.getWage()-3500);
update($cal);
end
rule "个人所得税:设置税率-->>应纳税所得额<=1500"
salience 2
no-loop true
activation-group "SETCess_Group"
when
$cal : Calculation(wagemore <= 1500)
then
$cal.setCess(0.03);
$cal.setPreminus(0);
update($cal);
end
rule "个人所得税:设置税率-->>应纳税所得额在1500至4500之间"
salience 2
no-loop true
activation-group "SETCess_Group"
when
$cal : Calculation(wagemore > 1500 && wagemore <= 4500)
then
$cal.setCess(0.1);
$cal.setPreminus(105);
update($cal);
end
rule "个人所得税:设置税率-->>应纳税所得额在4500志9000之间"
salience 2
no-loop true
activation-group "SETCess_Group"
when
$cal : Calculation(wagemore > 4500 && wagemore <= 9000)
then
$cal.setCess(0.2);
$cal.setPreminus(555);
update($cal);
end
rule "个人所得税:设置税率-->>应纳税所得额在9000志35000之间"
salience 2
no-loop true
activation-group "SETCess_Group"
when
$cal : Calculation(wagemore > 9000 && wagemore <= 35000)
then
$cal.setCess(0.25);
$cal.setPreminus(1005);
update($cal);
end
rule "个人所得税:设置税率-->>应纳税所得额在35000至55000之间"
salience 2
no-loop true
activation-group "SETCess_Group"
when
$cal : Calculation(wagemore > 35000 && wagemore <= 55000)
then
$cal.setCess(0.3);
$cal.setPreminus(2755);
update($cal);
end
rule "个人所得税:设置税率-->>应纳税所得额在55000至80000之间"
salience 2
no-loop true
activation-group "SETCess_Group"
when
$cal : Calculation(wagemore > 55000 && wagemore <= 80000)
then
$cal.setCess(0.35);
$cal.setPreminus(5505);
update($cal);
end
rule "个人所得税:设置税率-->>应纳税所得额在80000以上"
salience 2
no-loop true
activation-group "SETCess_Group"
when
$cal : Calculation(wagemore > 80000)
then
$cal.setCess(0.45);
$cal.setPreminus(13505);
update($cal);
end
rule "个人所得税:计算税后工资"
salience 1
when
$cal : Calculation(wage > 0 && wagemore > 0 && wagemore > 0 && cess > 0)
then
$cal.setWageminus($cal.getWagemore()*$cal.getCess()-$cal.getPreminus());
$cal.setActualwage($cal.getWage()-$cal.getWageminus());
System.out.println("-----税前工资:"+$cal.getWage());
System.out.println("-----应纳税所得额:"+$cal.getWagemore());
System.out.println("-----税率:" + $cal.getCess());
System.out.println("-----速算扣除数:" + $cal.getPreminus());
System.out.println("-----扣税额:" + $cal.getWageminus());
System.out.println("-----税后工资:" + $cal.getActualwage());
end
(3) 创建RuleService
/**
* 调用规则引擎,执行规则
*/
@Service
public class RuleService {
@Autowired
private KieBase kieBase;
//个人所得税计算
public Calculation calculate(Calculation calculation){
KieSession kieSession = kieBase.newKieSession();
kieSession.insert(calculation);
kieSession.fireAllRules();
kieSession.dispose();
return calculation;
}
}
(4) 创建RuleController
@RestController
@RequestMapping("/rule")
public class RuleController {
@Autowired
private RuleService ruleService;
@RequestMapping("/calculate")
public Calculation calculate(double wage){
Calculation calculation = new Calculation();
calculation.setWage(wage);
calculation = ruleService.calculate(calculation);
System.out.println(calculation);
return calculation;
}
}
- 上一篇: drools执行完某个规则后终止别的规则执行
- 下一篇: 基于Flink和规则引擎的实时风控解决方案
猜你喜欢
- 2024-10-02 drools中no-loop和lock-on-active的区别
- 2024-10-02 drools中使用全局变量(全局变量errno)
- 2024-10-02 基于Flink和规则引擎的实时风控解决方案
- 2024-10-02 drools执行完某个规则后终止别的规则执行
- 2024-10-02 规则引擎Drools 6.5 Final 入门(规则引擎使用案例场景)
- 2024-10-02 JAVA-工作流引擎-activiti-Tasks介绍
- 2024-10-02 drools中使用function(drools实例)
- 2024-10-02 drools执行指定的规则(drools使用)
- 2024-10-02 Drools在eclipse中的安装与验证(eclipse安装installation folder)
- 2024-10-02 drools规则属性(rule attributes)的使用
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- jdk (81)
- putty (66)
- rufus (78)
- 内网穿透 (89)
- okhttp (70)
- powertoys (74)
- windowsterminal (81)
- netcat (65)
- ghostscript (65)
- veracrypt (65)
- asp.netcore (70)
- wrk (67)
- aspose.words (80)
- itk (80)
- ajaxfileupload.js (66)
- sqlhelper (67)
- express.js (67)
- phpmailer (67)
- xjar (70)
- redisclient (78)
- wakeonlan (66)
- tinygo (85)
- startbbs (72)
- webftp (82)
- vsvim (79)
本文暂时没有评论,来添加一个吧(●'◡'●)