Drools的API调用

2024-08-29 06:18
文章标签 调用 api drools

本文主要是介绍Drools的API调用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在上一章节里,小编简单的讲述了规则文件的编辑语法与规范,读者还没有看过rule的执行过程,下面我们就通过例子对rule进行一下调用。在Drools当中,规则的编译与运行要通过Drools提供的各种API来实现,这些API总体来讲可以分为三类:规则编译规则收集规则的执行

在调用时,我们先要做以下几个操作:

1、Kmodule.xml的编辑

kmodule.xml文件放到src/main/resources/META-INF/文件夹下


代码的实现(具体内容)

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

分析上面代码:

1)   一个kmodule里面可包含多kbase,这个也是我们这个例子里面的用例对应drl规则文件的例子,每一个kbase都有一个name,可以取任意字符串,但是不能重名。

2)   然后有一个packages,可以看到packages里面的字符串其实就是src/main/resources下面的文件夹的名称,或者叫包名,规则引擎会根据这里定义的包来查找规则定义文件。可以同时定义多个包,以逗号分隔开来就行。每一个kbase下面可以包含多个ksession,当然本例中都自定义了一个。注:packages 是以小数点进行分离的,与java中package是一样的,指的是物理路径,packages只能指到该值的路径,是不能递归子文件夹的,这一点读者要谨记。

3)   每一个ksession都有一个name,名字也可以是任意字符串,但是也不能重复。kbase和ksession里面的name属性是全局不能重复的。kbase和ksession中其实还有很多其它的属性,每一个kbase下面可以包含多个ksession。

4)   在运行时,KieContainer会根据*Model对象来创建KieModule、KieBase、KieSession对象。其中KieModule和KieBase只会创建一次,而KieSession则有可能创建多次,因为KieSession的创建成本很低,同时KieSession包含了运行时的数据,所以可以销毁、创建若干次。

 

2、API的说明,创建一个java文件

在写java文件之前我们先要引用drools相关的jar包,小编再次说明一下,以下的例子都是drools6.4版本

Mavne pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.drools.modules.test</groupId><artifactId>drools-moudles</artifactId><version>1.0-SNAPSHOT</version><packaging>jar</packaging><name>drools-moudles</name><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><!-- drools 规则引擎 版本 --><drools.version>6.4.0.Final</drools.version><spring.version>4.2.6.RELEASE</spring.version><log4j2.version>2.5</log4j2.version></properties><!-- 依赖项定义 --><dependencies><!-- start drools --><dependency><groupId>org.drools</groupId><artifactId>drools-core</artifactId><version>${drools.version}</version></dependency><dependency><groupId>org.drools</groupId><artifactId>drools-compiler</artifactId><version>${drools.version}</version></dependency><dependency><groupId>org.drools</groupId><artifactId>drools-decisiontables</artifactId><version>${drools.version}</version></dependency><dependency><groupId>org.drools</groupId><artifactId>drools-workbench-models-guided-template</artifactId><version>${drools.version}</version></dependency><dependency><groupId>org.drools</groupId><artifactId>drools-simulator</artifactId><version>${drools.version}</version></dependency><dependency><groupId>org.jbpm</groupId><artifactId>jbpm-flow-builder</artifactId><version>${drools.version}</version></dependency><dependency><groupId>org.kie</groupId><artifactId>kie-spring</artifactId><version>${drools.version}</version></dependency><dependency><groupId>org.kie</groupId><artifactId>kie-ci</artifactId><version>${drools.version}</version></dependency><dependency><groupId>org.kie</groupId><artifactId>kie-internal</artifactId><version>${drools.version}</version></dependency><dependency><groupId>org.kie</groupId><artifactId>kie-api</artifactId><version>${drools.version}</version></dependency><dependency><groupId>org.drools</groupId><artifactId>drools-workbench-models-guided-dtable</artifactId><version>${drools.version}</version></dependency><dependency><groupId>org.drools</groupId><artifactId>drools-templates</artifactId><version>${drools.version}</version></dependency><!-- end drools --></dependencies><build><testResources><testResource><directory>${project.basedir}/src/main/resources</directory></testResource></testResources><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.7</source><target>1.7</target></configuration></plugin></plugins></build>
</project>

JAVAcode

package com.drools.test;import org.kie.api.KieServices;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;public class TestWrod{public static void main(String[] args) {   KieServices kss = KieServices.Factory.get();KieContainer kc = kss.getKieClasspathContainer();KieSession ks =kc.newKieSession("session");int count = ks.fireAllRules();System.out.println("总执行了"+count+"条规则");ks.dispose();}
}

分析java代码

从classpath中读取kmodule,创建KieContainder容器。

利用kieContainer对象创建一个新的KieSession,创建session的时候我们传入了一个name: session”,这个字符串很眼熟吧,这个就是我们定义的kmodule.xml文件中定义的ksession的name。

kieContainer根据kmodule.xml定义的ksession的名称找到KieSession的定义,然后创建一个KieSession的实例。

KieSession就是一个到规则引擎的链接,通过它就可以跟规则引擎通讯,并且发起执行规则的操作。

然后通过kSession.fireAllRules方法来通知规则引擎执行规则

ks.dispose();最后将kiesession连接关闭

那让我们看一下结果 如图2-2


上面只最简单的helloworld了,是不是很容易就懂了呢,好!那小编再增加一点点难度,我们往规则里插入一个值,来进行一个简单的业务判断。

业务说明:判断人名是张三,年龄30岁,就将该人名改为李四

实体POJO 

package com.drools.test;public class Person {private String name;private int age;private String desc;public Person(String name, int age) {this.name = name;this.age = age;}….此处省略get set 方法,但读者做例子时一定要加上哦

规则代码如下:

Person.drl

package rules.testwrodimport com.drools.test.Person
rule test001when$p:Person(name=="张三",age==30);then$p.setName("李四");System.out.println("改完后的名字"+$p.getName());
end

在API代码说明

import org.kie.api.KieServices;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import org.kie.api.runtime.rule.FactHandle;public class TestWrod
{public static void main(String[] args){KieServices kss = KieServices.Factory.get();KieContainer kc = kss.getKieClasspathContainer();KieSession ks =kc.newKieSession("session");Person person=new Person("张三",30);FactHandle insert = ks.insert(person);int count = ks.fireAllRules();System.out.println("总执行了"+count+"条规则");System.out.println(person.getName());ks.dispose();}
}

那让我们看一下结果 如图2-3


                                (图2-3)

在控制台上我们可以看到是我们想要的结果。在规则里变了,java中的Bean也发生了变化,这就满意了我们业务上的要求?

小编为什么在最后打了一个问号呢,我们的真的改变了fact对象嘛,是我们真正想要的结果嘛,看起来是没问题的,控制台也输出,但如果我稍稍修改一下业务的话,在之前的业务上添加 并将名为李四的的年龄设置为40,那我规则就应该是这样了

规则代码如下:

Person.drl

package rules.testwrodimport com.drools.test.Person
rule test001when$p:Person(name=="张三",age==30);then$p.setName("李四");System.out.println("改完后的名字"+$p.getName());
endrule test002when$p:Person(name=="李四");then$p.setAge(40);System.out.println("改完后的名字"+$p.getName()+"改完后的年龄"+$p.getAge());
end

java的代码不变,执行结果,我们发现结果与第一次相同,难道是我们写的代码没有编译?为什么没有生效呢,test001规则明明已经将Person中的name属性改为“李四”了那为什么值规则test002没有执行呢,这里小编就要郑重的提一句了,这是因为rete的算法问题,什么是rete算法呢,在后面的章节里小编会做一个详细的说明,好!,那小编先带着读者解决这个问题。其实解决起来很简单,只要在第一个规则里添加之前所说的update 就可以了。

将test001规则中的then中 $p.setName("李四");下方添加update($p);再次运行

那让我们看一下结果 如图


注:小编是这样认为的:其实导致这个原因的是因为rete算法的问题,简单说明一下,rete算法会将规则中的内容先全部加载出来,我们在规则中看似把Person的name属性改变了,但本质中只是引用发生了改变,fact对象是没有真正改变的。当fact对象发生真正改变时,规则将重新执行,但这样是有风险的,容易产生死循环。解决方案会在rule的属性中有说明

下面是小编的微信转帐二维码,小编再次谢谢读者的支持,小编会更努力的

----请看下方↓↓↓↓↓↓↓

百度搜索 Drools从入门到精通:可下载开源全套Drools教程

深度Drools教程不段更新中:


更多Drools实战陆续发布中………

扫描下方二维码关注公众号 ↓↓↓↓↓↓↓↓↓↓



这篇关于Drools的API调用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1117079

相关文章

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

浅析如何使用Swagger生成带权限控制的API文档

《浅析如何使用Swagger生成带权限控制的API文档》当涉及到权限控制时,如何生成既安全又详细的API文档就成了一个关键问题,所以这篇文章小编就来和大家好好聊聊如何用Swagger来生成带有... 目录准备工作配置 Swagger权限控制给 API 加上权限注解查看文档注意事项在咱们的开发工作里,API

一分钟带你上手Python调用DeepSeek的API

《一分钟带你上手Python调用DeepSeek的API》最近DeepSeek非常火,作为一枚对前言技术非常关注的程序员来说,自然都想对接DeepSeek的API来体验一把,下面小编就来为大家介绍一下... 目录前言免费体验API-Key申请首次调用API基本概念最小单元推理模型智能体自定义界面总结前言最

JAVA调用Deepseek的api完成基本对话简单代码示例

《JAVA调用Deepseek的api完成基本对话简单代码示例》:本文主要介绍JAVA调用Deepseek的api完成基本对话的相关资料,文中详细讲解了如何获取DeepSeekAPI密钥、添加H... 获取API密钥首先,从DeepSeek平台获取API密钥,用于身份验证。添加HTTP客户端依赖使用Jav

C#使用DeepSeek API实现自然语言处理,文本分类和情感分析

《C#使用DeepSeekAPI实现自然语言处理,文本分类和情感分析》在C#中使用DeepSeekAPI可以实现多种功能,例如自然语言处理、文本分类、情感分析等,本文主要为大家介绍了具体实现步骤,... 目录准备工作文本生成文本分类问答系统代码生成翻译功能文本摘要文本校对图像描述生成总结在C#中使用Deep

redis防止短信恶意调用的实现

《redis防止短信恶意调用的实现》本文主要介绍了在场景登录或注册接口中使用短信验证码时遇到的恶意调用问题,并通过使用Redis分布式锁来解决,具有一定的参考价值,感兴趣的可以了解一下... 目录1.场景2.排查3.解决方案3.1 Redis锁实现3.2 方法调用1.场景登录或注册接口中,使用短信验证码场

使用C/C++调用libcurl调试消息的方式

《使用C/C++调用libcurl调试消息的方式》在使用C/C++调用libcurl进行HTTP请求时,有时我们需要查看请求的/应答消息的内容(包括请求头和请求体)以方便调试,libcurl提供了多种... 目录1. libcurl 调试工具简介2. 输出请求消息使用 CURLOPT_VERBOSE使用 C

5分钟获取deepseek api并搭建简易问答应用

《5分钟获取deepseekapi并搭建简易问答应用》本文主要介绍了5分钟获取deepseekapi并搭建简易问答应用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需... 目录1、获取api2、获取base_url和chat_model3、配置模型参数方法一:终端中临时将加

使用DeepSeek API 结合VSCode提升开发效率

《使用DeepSeekAPI结合VSCode提升开发效率》:本文主要介绍DeepSeekAPI与VisualStudioCode(VSCode)结合使用,以提升软件开发效率,具有一定的参考价值... 目录引言准备工作安装必要的 VSCode 扩展配置 DeepSeek API1. 创建 API 请求文件2.