drools规则引擎可视化

本文介绍了Drools规则引擎的基本使用,包括添加依赖、配置kmodule.xml、创建实体类、编写DRL规则脚本及JUnit测试。此外,还详细阐述了如何通过Drools Workbench进行动态规则管理,包括创建项目、对象、DRL文件,以及远程部署和SpringBoot工程的集成。通过实例展示了动态更新规则而无需重启服务的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考:drools规则引擎可视化

Drools是一款基于Java的优秀的规则引擎,将复杂多变的业务规则从硬编码中解放出来,以规则脚本的形式存放在文件中,使得修改规则不需要改动代码重启服务就能生效。
Drools有一定的学习成本,官方英文文档非常详细,但中文文档少,本文将通过一篇文章来介绍Drools的使用和动态部署,这也是我学习过后的总结,希望对你入门Drools有帮助。

官网地址:https://www.drools.org/
github: https://github.com/kiegroup/drools

一、简单使用

给不同商品设置不同折扣。

1.1 pom.xml

<dependency>      
  <groupId>org.droolsgroupId>      
  <artifactId>drools-compilerartifactId>      
<version>7.23.0.Finalversion>dependency>

1.2 kmodule.xml 

kmodule.xml 文件用于配置规则脚本,可以有多个kbase
文件放在项目resources/META-INF目录下可以自动加载

<?xml  version="1.0" encoding="UTF-8"?><kmodule xmlns="http://www.drools.org/xsd/kmodule">    
<kbase name="rules" packages="rules">        
<ksession name="ksession-rule"/>    

1.3 Product Bean实体

//lombok注解@Datapublic class Product {    
    public static final String DIAMOND = "DIAMOND";    
    public static final String GOLD = "GOLD";    
    private String type;    
    private int discount;
}

1.4 Rules.drl 

resources/rules/Rules.drl 规则脚本

package rulesimport drools.Product

// 当商品类型是DIAMOND时,打折为15%
rule Offer4Diamond    
    when        
        productObject:Product(type == Product.DIAMOND)    
    then        
        productObject.setDiscount(15);    
end

//当商品类型是GOLD时,打折为25%
rule Offer4Gold 
    when        
        productObject: Product(type == Product.GOLD)    
    then        
        productObject.setDiscount(25);    
end

1.5 junit Test

@Testpublic void droolsTest() {        
    KieServices ks = KieServices.Factory.get();        
    KieContainer kieContainer = ks.getKieClasspathContainer();       
    KieSession kSession = kieContainer.newKieSession("ksession-rule");        

    Product product = new Product();        
    product.setType(Product.GOLD);        
    kSession.insert(product);        
    int count = kSession.fireAllRules();        
    System.out.println("命中了" + count + "条规则");        
    System.out.println("商品" + product.getType() + "的商品折扣为" + product.getDiscount() + "%");    
}

运行结果

命中了1条规则商品GOLD的商品折扣为25%

1.6 解释

kmodule.xml

  • 该文件用来配置规则表,可以包含多个kbase,每个kbase都有name属性,不能重复

  • kbase可以包含多个ksession, packages属性是src/main/resources目录下文件夹的包路径,可以定义多个包,逗号分隔,packages目录下的所有规则文件都会被加载,除了子目录

  • ksession 的name不能重复,Java代码中KieSession设置的name就是该配置的name

droolsTest

  • KieServices 该接口提供了很多方法,可以通过这些方法访问KIE关于构建和运行的相关对象,比如说可以获取KieContainer,利用KieContainer来访问KBase和KSession等信息;可以获取KieRepository对象,利用KieRepository来管理KieModule等。 KieServices就是一个中心,通过它来获取的各种对象来完成规则构建、管理和执行等操作。

  • KieContainerKieContainer可以理解为是一个KieBase的容器。

  • KieBase KieBase可以理解为是一个知识仓库,包含了若干的规则、流程、方法等,在Drools中主要就是规则和方法,KieBase本身并不包含运行时的数据之类的,如果需要执行规则KieBase中的规则的话,就需要根据KieBase创建KieSession。

  • KieSessionKieSession就是一个跟Drools引擎打交道的会话,其基于KieBase创建,它会包含运行时数据,包含“事实 Fact”,并对运行时数据事实进行规则运算。我们通过KieContainer创建KieSession是一种较为方便的做法,其实他本质上是从KieBase中创建出来

二、动态规则

实现动态规则有这几种思路

     1. 使用Workbench,通过Web管理页面动态生成配置规则

     2. 将规则以字符串的形式存入数据库,需要自己开发一套规则管理系统

使用Wrokbench

2.1 docker部署workbench

# worker-bench
docker run \
-p 8080:8080 \
-p 8001:8001 \
-d --name drools-wb jboss/drools-workbench-showcase:7.5.0.Final

# kie-server
docker run \
-p 8180:8180 \
-d --name kie-server \
--link drools-wb:kie_wb jboss/kie-server-showcase:7.5.0.Final

# use
docker run \
-p 8080:8080 \
-p 8001:8001 \
-d --name drools-workbench-showcase \
docker.io/jboss/drools-workbench-showcase:latest

访问http://ip地址:8080/drools-wb 
默认账号/密码 admin/admin

360109cafab464aa865830dd2c535307.png

2.2 创建项目

d88d318a32b74c21380946696e2fa12f.png

23b7ca66ec0f3e958a164c751596971e.png

2.3 创建Object

1a695837ec3c86073638c2cb47f44922.png

24cc95e13d13b9e9c2fe43c3afd6ddbc.png

2.4 创建DRL文件

8337e69effc9a7f3939e33d1d173247f.png

e887e6f0a6c8af36babfcbb155453e7c.png

2.5 部署

c7978701c61de7d309f15c176644671f.png

2.6 使用部署的规则文件

远程规则Maven仓库地址获取

3b1bd01ab6a91ee89aa8d29de1235f1e.png

57411583bfc56184e64b2c7019c7e6c6.png

本地Maven仓库settings.xml配置,这里只摘录了需要添加的3处,需要对应去添加

<servers>
	<!--...-->
	<server>
		<username>admin</username>
		<password>admin</password>
		<id>guvnor-m2-repo
		</id>
	</server>
	<!--...-->
</servers>
<profiles>
	<!--...-->
	<profile>
		<id>guvnor-m2-repo</id>
		<repositories>
			<repository>
				<id>guvnor-m2-repo</id>
				<name>Guvnor M2 Repo</name>
				<url>http://10.211.55.7:8080/drools-wb/maven2/</url>
				<layout>
					default
				</layout>
				<releases>
					<enabled>true</enabled>
					<updatePolicy>always</updatePolicy>
				</releases>
				<snapshots>
					<enabled>true</enabled>
					<updatePolicy>always</updatePolicy>
				</snapshots>
			</repository>
		</repositories>
		<activation>
			<activeByDefault>true</activeByDefault>
		</activation>
	</profile>
	<!--...-->
</profiles>
<activeProfiles>
	<activeProfile>guvnor-m2-repo</activeProfile>
</activeProfiles>

2.7 创建SpringBoot工程

Product实体,包路径要跟规则文件中的一致

@Data
public class Product {    
	private String type;    
	private int discount;
}

DroolsController.java

@RestController
@RequestMapping("/api/")
@Slf4j
public class DroolsController {
	@PostMapping("getdiscount")
	public Product getDiscount(Product product) throws IOException {
		KieServices ks = KieServices.Factory.get();

		// RELEASE 代表使用jar包的最新正式版        
		ReleaseIdImpl releaseId = new ReleaseIdImpl("com.myteam", "test", "RELEASE");
		KieContainer kieContainer = ks.newKieContainer(releaseId);
		
        // 自动扫描Maven仓库,有新版本会自动下载        
		KieScanner kieScanner = ks.newKieScanner(kieContainer);
		kieScanner.start(3000);
		KieSession kieSession = kieContainer.newKieSession();
		kieSession.insert(product);
		int count = kieSession.fireAllRules();
		log.info("共执行了{}条规则", count);
		log.info("商品{}的折扣为{}%", product.getType(), product.getDiscount());
		
        return product;
	}
}

PostMan访问接口

503ecbf46e325f2ae5376691e5a8b82c.png

与DRL规则文件中配置的一致

2.8 动态规则

修改ppdrl.drl规则表,修改GOLD的打折为50%,保存规则,将项目版本提高一个版本,并build&deploy项目

d4b5654aeee86e065762d542f4dfb2ec.png

e3ea25b5bf5a8dbef89e9a777f2d709e.png

d758c6bdb379f4c87f924443e395d693.png

再次访问接口,GOLD的折扣已经变为50%,其中没有重启服务

0404b9c5850e7c6513945a56253a2938.png

Drools规则引擎是一种强大的业务规则管理系统,它能够帮助开发人员以一种可视化的方式管理和执行规则。 要学习Drools规则引擎可视化教程,我们需要先了解Drools的基本概念和术语。Drools使用规则文件(DSL、DRL)来描述和管理业务规则,通常以文本格式进行编写。 可视化教程的核心是使用Drools Workbench,这是Drools规则引擎可视化开发环境。Drools Workbench提供了易于使用的图形化界面,使我们能够以可视化的方式创建、编辑和管理规则。 在可视化教程中,我们将学习如何通过Drools Workbench创建一个新的规则项目。这个项目将包含一个规则集合,每个规则都是由条件和动作组成的。我们可以使用Drools Workbench的图形化界面来定义这些条件和动作,这样就不需要手动编写规则文件。 在创建规则项目后,可视化教程将指导我们如何添加和编辑规则。通过拖拽和放置操作,我们可以创建条件和动作,然后设置它们的属性。这样,就可以准确地定义规则的触发条件和执行逻辑。 除了创建和编辑规则可视化教程还将介绍如何使用Drools Workbench的其他功能来管理规则项目。我们可以检查和验证规则的正确性,也可以发布和部署规则以在应用程序中执行。 总的来说,Drools规则引擎可视化教程为开发人员提供了一种更直观、更高效的方式来管理和执行规则。它将大大简化规则开发过程,并提供了更好的用户体验,使业务规则管理变得更加容易和可靠。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值