Linux下docker部署drools并集成项目使用

Linux下docker部署drools并集成项目使用

  • 一、背景介绍
  • 二、 思路方案
  • 三、过程
  • 四、总结

一、背景介绍

上一篇文章是对规则引擎的基本介绍,本篇文章是对于drools规则引擎的基本使用。

二、 思路方案

前提:首先保证主机联网、有docker环境、保证Linux空闲内存在4G左右

三、过程

一、搭建WorkBench

  1. 拉取镜像到本地
docker pull jboss/drools-workbench-showcase
  1. 启动镜像
docker run -p 8080:8080 -p 8001:8001 -d --name drools-workbench jboss/drools-workbench-showcase:latest
  1. 访问WorkBench
    浏览器访问http://ip:8080/business-central

在这里插入图片描述
4. workbench相关的账号密码:

USER PASSWORD ROLE
*********************************************
admin admin admin,analyst,kiemgmt
krisv krisv admin,analyst
john john analyst,Accounting,PM
sales-rep sales-rep analyst,sales
katy katy analyst,HR

二、搭建Kie-Server

  1. 拉取镜像到本地
docker pull jboss/kie-server-showcase
  1. 然后kie-server启动并与workbench关联
docker run -p 8180:8080 -d --name kie-server --link drools-workbench:kie_wb jboss/kie-server-showcase:latest
  1. 访问kie-server
 http://ip:8180/kie-server/services/rest/server/

在这里插入图片描述

三、Spring Boot项目整合Drools规则引擎

Spring boot整合Drools之后的最终效果是我在Drools workbench中修改对应的规则。然后将其发布到kie-server上。不用重启的应用程序,该规则可以在程序运行中生效。

示例:

在一个业务场景中我们需要多人员的上次的考核时间进行判断。如果考核时间超过了11个月则该人员需要重新考核。由于对于考核时间可能会根据业务调整发生改变,比如由于需要大家对人员的质量的保证这个时候需要缩短考核时间到5个月。及考核时间超过5个月之后该人员需要重新考核。针对于这样的业务场景我们将考核时间这个规则抽离到drools规则引擎中。

  1. 在spring boot项目中新建数据实体。
    数据实体里面的属性包括人员的基本数据,和上次考核时间以及是否需要重新考核的accessFlag属性。
    在这里插入图片描述

  2. 在drools workbench中创建项目并创建实体和配置规则,最后发布服务。
    1.进入workbench创建项目
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    2.创建资产——数据对象
    先创建数据对象,必须与项目中的数据对象保持一致(名称和包路径)
    在这里插入图片描述
    项目中的数据对象
    数据对象名称和软件包,分别对应项目中的数据对象名称和包路径
    软件包可以通过添加资产-软件包补充,最终创建出与项目中数据对象相同的包路径。
    在这里插入图片描述
    在这里插入图片描述
    3.编写数据对象的代码
    将程序中的数据对象的属性和方法复制到源代码中,并保存。
    在这里插入图片描述
    4.编写对应的规则
    这里考虑到需要一个可视化界面便于修改规则所以选用了决策表。
    在这里插入图片描述
    决策表的名称和软件包,可以任意修改。
    在这里插入图片描述
    首选引入对应的数据对象
    在这里插入图片描述
    在这里插入图片描述
    根据自己项目的要求,编写对应的规则。
    这里我只是做一个示例:
    添加对应的列
    在这里插入图片描述
    先选择Add a Condition 表示添加一个条件
    在这里插入图片描述
    选择计算类型
    在这里插入图片描述
    选择需要参与计算的字段
    在这里插入图片描述
    选择操作符
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    点击完成之后,可以再Columns中查看
    在这里插入图片描述
    再选择条件通过之后的执行,选择Set the value of a field
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述
再点击Model可以看到可视化界面
在这里插入图片描述
选择增加一行
在这里插入图片描述
补充上我们的规则数据
在这里插入图片描述

点击源代码就可以看到生成的代码,之后点击保存
在这里插入图片描述
5.设置kie bases将该项目发布到kie-server中
在这里插入图片描述
在这里插入图片描述
6.进行构建和发布
在这里插入图片描述
7.查看kie-server
在这里插入图片描述
在这里插入图片描述
访问kie-server容器信息

http://ip:8180/kie-server/services/rest/server/containers

页面中能够找到对应的容器,表示已经发布到kie-server中了。
在这里插入图片描述

  1. 项目引入依赖:
<!-- kie-server -->
<dependency><groupId>org.kie.server</groupId><artifactId>kie-server-client</artifactId>
<drools.version>7.73.0.Final</drools.version>
</dependency>
<dependency><groupId>org.kie.server</groupId><artifactId>kie-server-api</artifactId>
<drools.version>7.73.0.Final</drools.version>
</dependency>
  1. 填写配置文件:
drools服务
kie-server:
url: http://ip:8180/kie-server/services/rest/server
username: ***
password: ***
#配置容器名
containerId: test_1.0.0-SNAPSHOT
timeout: 1000
#在kie-server中配置的session
session: session6
#session: hello-session
  1. 定义资源类
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.Configuration;/*** kie-server相关配置** @author * @date 2023/9/6 11:16**/
@Data
@RefreshScope
@ConfigurationProperties(prefix = "kie-server")
public class KieServerProperties {/*** 地址*/private String url;/*** 用户名*/private String username;/*** 密码*/private String password;/*** 容器*/private String containerId;/*** 过期时间*/private String timeout;/*** 会话名称*/private String session;
}
  1. 封装kie server服务类
import org.kie.api.KieServices;
import org.kie.api.command.Command;
import org.kie.api.command.KieCommands;
import org.kie.api.runtime.ExecutionResults;
import org.kie.server.api.marshalling.MarshallingFormat;
import org.kie.server.api.model.KieServiceResponse;
import org.kie.server.api.model.ServiceResponse;
import org.kie.server.client.KieServicesClient;
import org.kie.server.client.KieServicesConfiguration;
import org.kie.server.client.KieServicesFactory;
import org.kie.server.client.RuleServicesClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;/*** 远程kie-server相关服务** @author * @date 2023/9/6 13:51**/
@Service
public class KieClientService {private static final Logger log = LoggerFactory.getLogger(KieClientService.class);@Autowiredprivate KieServerProperties kieServerProperties;/*** 获取命令对象** @return 命令对象*/public KieCommands getKieCommands() {return KieServices.Factory.get().getCommands();}/*** 获取存放命令的LinkedList** @return 存放命令的LinkedList*/public List<Command<?>> getKieCommandList() {return new LinkedList<>();}/*** 执行规则** @param commandList 存放命令的LinkedList* @param kieCommands 命令对象* @return 执行结果*/public ExecutionResults executeCommands(List<Command<?>> commandList, KieCommands kieCommands) {RuleServicesClient client = this.getClient();ServiceResponse<ExecutionResults> serviceResponse = client.executeCommandsWithResults(kieServerProperties.getContainerId(),kieCommands.newBatchExecution(commandList, kieServerProperties.getSession()));if (serviceResponse == null || !KieServiceResponse.ResponseType.SUCCESS.equals(serviceResponse.getType())) {log.error("调用kie-server失败");throw ServiceExceptionUtil.exception(new ErrorCode(500, "调用kie-server失败"));}return serviceResponse.getResult();}/*** 根据配置获取连接** @return 与kie-server的连接*/private RuleServicesClient getClient() {//配置信息KieServicesConfiguration kieServicesConfiguration = KieServicesFactory.newRestConfiguration(kieServerProperties.getUrl(), kieServerProperties.getUsername(),kieServerProperties.getPassword(), Long.parseLong(kieServerProperties.getTimeout()));kieServicesConfiguration.setMarshallingFormat(MarshallingFormat.JSON);RuleServicesClient servicesClient;try {//创建规则服务客户端KieServicesClient kieServicesClient = KieServicesFactory.newKieServicesClient(kieServicesConfiguration);servicesClient = kieServicesClient.getServicesClient(RuleServicesClient.class);} catch (Exception exception) {log.error(exception.getMessage());throw ServiceExceptionUtil.exception(new ErrorCode(500, "无法建立到kie-server的连接"));}if (servicesClient == null) {log.error("servicesClient为null");throw ServiceExceptionUtil.exception(new ErrorCode(500, "无法建立到kie-server的连接"));}return servicesClient;}/*** 将list插入kie-server工作内存并处理** @param list 要插入的数据列表* @param <T>  数据的类型* @return 原列表,内容已改变*/public <T> List<T> processList(List<T> list) {if (StringUtils.isEmpty(list)) {return new ArrayList<>();}List<Command<?>> kieCommandList = this.getKieCommandList();KieCommands kieCommands = this.getKieCommands();for (int i = 0; i < list.size(); i++) {kieCommandList.add(kieCommands.newInsert(list.get(i), String.valueOf(i)));}ExecutionResults executionResults = this.executeCommands(kieCommandList, kieCommands);for (int i = 0; i < list.size(); i++) {BeanUtils.copyProperties(executionResults.getValue(String.valueOf(i)), list.get(i));}return list;}
}
  1. 编写测试代码
@SpringBootTest
public class TrainingApplicationTest {@Autowiredprivate KieClientService kieClientService;@Testpublic void test(){QualificationAssessmentDTO qualificationAssessmentDTO=new QualificationAssessmentDTO();qualificationAssessmentDTO.setScore(2.4);qualificationAssessmentDTO.setType("飞行签派员");qualificationAssessmentDTO.setIntervalTime(12);KieCommands kieCommands = kieClientService.getKieCommands();List<Command<?>> kieCommandList = kieClientService.getKieCommandList();kieCommandList.add(kieCommands.newInsert(qualificationAssessmentDTO,"qualificationAssessmentDTO"));ExecutionResults executionResults = kieClientService.executeCommands(kieCommandList, kieCommands);QualificationAssessmentDTO dto = (QualificationAssessmentDTO) executionResults.getValue("qualificationAssessmentDTO");System.out.println(JsonUtils.toJsonString(dto));}}

测试结果:
在这里插入图片描述
在workbench中修改判断条件的值为5,并重新发布。
可以发现规则已经生效。
在这里插入图片描述

四、总结

drools规则引擎运行逻辑:在drools-workBench中编写对应的规则最后将其发布到kie-server中。在我们程序中集成kie-Server将我们需要进行规则判断的model传输到kie-server进行规则判断。kie-server再将修改之后的mode传输到我们的应用程序中。由于规则和规则的判断是放到drools-workbench和kie-server中。所以当规则发生变动,并不会影响到原有的应用程序的正常运行。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3281321.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

OS—文件系统

目录 一. 文件系统结构I/O 控制层基本文件系统文件组织模块逻辑文件系统 二. 文件系统布局文件系统在磁盘中的结构主引导记录(MasterBoot Record,MBR)引导块(boot block)超级块(super block)文件系统中空闲块的信息 文件系统在内存中的结构 三. 外存空间管理空闲表法空闲链表法…

面向对象 - 概述、类的创建、 实例化与内存解析

一、学习面向对象的三条主线 Java类及类的成员&#xff1a;&#xff08;重点&#xff09;属性、方法、构造器&#xff1b;&#xff08;熟悉&#xff09;代码块、内部类面向对象的特征&#xff1a;封装、继承、多态、&#xff08;抽象&#xff09;其他关键字的使用&#xff1a;…

北欧风情在浦东,5 大公司为你定制美好

在繁华的浦东&#xff0c;追求高品质生活的您&#xff0c;是否渴望拥有一个充满北欧风情的温馨家园&#xff1f;今天&#xff0c;我们将为您推荐 5 家顶尖的装修公司&#xff0c;它们将以精湛的工艺和独特的设计理念&#xff0c;为您量身定制梦想中的北欧风家居。 推荐一&#…

大数据-56 Kafka SpringBoot与Kafka 基础简单配置和使用

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

大厂的堡垒机到底是啥?为什么需要它?

什么是堡垒机 堡垒机&#xff0c;即在一个特定的网络环境下&#xff0c;为了保障网络和数据不受来自外部和内部用户的入侵和破坏&#xff0c;而运用各种技术手段监控和记录运维人员对网络内的服务器、网络设备、安全设备、数据库等设备的操作行为&#xff0c;以便集中报警、及…

【文件解析漏洞】实战详解!

漏洞描述&#xff1a; 文件解析漏洞是由于中间件错误的将任意格式的文件解析成网页可执行文件&#xff0c;配合文件上传漏洞进行GetShell的漏洞! IIS解析漏洞&#xff1a; IIS6.X&#xff1a; 方式一:目录解析 在网站下建立文件夹的名字为.asp/.asa 的文件夹&#xff0c;其目…

免费发送邮件两种接口方式:SMTP和邮件API

SMTP与邮件API在处理大批量邮件发送时&#xff0c;哪个更稳定&#xff1f; 在现代信息化的社会中&#xff0c;邮件已成为不可或缺的沟通工具。无论是个人还是企业&#xff0c;发送邮件都是日常工作的一部分。AokSend将详细介绍两种常用的免费发送邮件接口方式&#xff1a;SMTP…

麒麟V10系统统一认证子系统国际化

在适配麒麟V10系统统一认证子系统国际化过程中&#xff0c; 遇到了很多的问题&#xff0c;关键是麒麟官方的文档对这部分也是粗略带过&#xff0c;遇到的问题有: &#xff08;1&#xff09;xgettext无法提取C源文件中目标待翻译的字符串。 &#xff08;2&#xff09;使用msgf…

程序一调用这个接口就会崩溃, 因为他的静态库添加是放在release文件下,而我用的debug模式

程序一调用这个接口就会崩溃 因为他的静态库添加是放在release文件下 而我用的debug模式 DESTDIR ../x64/ReleaseINCLUDEPATH ./../3rdparty/ZZDecode/include LIBS -lopengl32 \-lglu32 \-luser32 \./../3rdparty/ZZDecode/x64/release/ZZDecodeInterface.lib

Python软件开发:AI毕业设计生成器引领未来

&#x1f31f; 革新软件开发&#xff1a;Python毕业设计生成器引领未来 &#x1f680; 目录 &#x1f31f; 革新软件开发&#xff1a;Python毕业设计生成器引领未来 &#x1f680;&#x1f393; 课题简介&#x1f31f; 开发目的&#x1f4c8; 开发意义 &#x1f4da; 研究方法&…

Jvm的无关性

Jvm具有无关性&#xff0c;主要体现在两个方面&#xff1a; 平台无关性&#xff1a;任何操作系统都能运行Java代码。 语言无关性&#xff1a;Jvm能运行除Java以外的其他代码。 Java源代码首先需要使用Javac编译器编译成 .class文件&#xff0c;然后由Jvm执行.class文件&…

如何准备 Java API 文档以供下游对接

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119@qq.com] 📱个人微信:15279484656 🌐个人导航网站:www.forff.top 💡座右铭:总有人要赢。为什么不能是我呢? 专栏导…

如何在 Odoo 16 Studio 中添加智能选项卡和管道

具有优雅定制功能的软件系统&#xff08;如 Odoo ERP&#xff09;可让客户调整和个性化其公司应用程序。定制在过去并不普遍&#xff0c;但现在对于组织来说&#xff0c;满足客户需求和需求激增至关重要。即使许多行业的竞争很少&#xff0c;但当前的竞争市场仍不稳定。尽管引入…

Mybatis批量更新数据库错误

问题&#xff1a;记录一次使用Mybatis批量更新数据库的错误&#xff0c;错误信息&#xff0c;Error updating database. Cause: org.postgresql.util.PSQLException: 错误: 字段 "update_time" 的类型为 timestamp without time zone, 但表达式的类型为 text 建议&am…

Prometheus+Grafana 监控平台实践-搭建常用服务监控告警

前言 Prometheus 是一个开放性的监控解决方案,通过各种 Exporter 采集当前主机/服务的数据,和 Grafana 相结合可以实现强大的监控和可视化功能 本篇将分享使用 docker compose 构建 Prometheus+Grafana,并监控之前文章所搭建的主机&服务,分享日常使用的一些使用经验 文…

7月速览| 卓翼飞思获荣誉、助大赛、展技术!

行业殊荣 ● 荣获 “全国低空经济先导产业行业产教融合共同体” 常务理事单位称号&#xff0c;助力打造低空经济产业领域人才智库。 “共同体”是低空经济领域&#xff0c;国家职教战略与新质生产力发展战略融合对接的重要成果。旨在汇聚优质资源&#xff0c;搭建交流平台&…

传统放牧方式与北斗科技的碰撞:北三短报文头羊定位追踪器PD28守护放牧生活

在大草原的广袤天地中&#xff0c;放牧生活是蒙古族人民的传统之一。然而&#xff0c;除了美丽和自由&#xff0c;放牧生活也伴随着一些危险。以前由于科技落后&#xff0c;人工成本低&#xff0c;主要依靠人力去放牧&#xff0c;牧民放牧顶风踏雪走个几十公里都极为寻常。除了…

AI赋能交通治理:非机动车监测识别技术在城市街道安全管理中的应用

引言 城市交通的顺畅与安全是城市管理的重要组成部分。非机动车如自行车、电动车、摩托车等在城市交通中扮演着重要角色&#xff0c;但同时也带来了管理上的挑战。尤其是在机动车道上误入非机动车的现象&#xff0c;不仅影响交通秩序&#xff0c;还可能引发交通事故。思通数科…

upload-labs靶场(1-19关)

upload-labs靶场 简介 upload-labs是一个使用php语言编写的&#xff0c;专门收集渗透测试过程中遇到的各种上传漏洞的靶场。旨在帮助大家对上传漏洞有一个全面的了解。目前一共19关&#xff0c;每一关都包含着不同上传方式。 注意&#xff1a;能运行<?php phpinfo();?&…

Linux的软硬连接

目录 见一下软硬连接 特征 什么是软硬连接&#xff0c;有什么用 软连接有什么用 硬连接有什么用 总结 见一下软硬连接 建立一个软连接 建立硬连接 特征 1. 软连接是一个独立的文件&#xff0c;因为有自己的inode号&#xff0c;由上图可知&#xff1b; 软连接的内容&…