首页 > 编程知识 正文

规则引擎 drools,开源规则引擎比较

时间:2023-05-04 01:16:36 阅读:126745 作者:3870

Drools规则引擎的简单用例。 配置规则的摘要可以动态更新,并且根据规则引擎的运行动态更新规则的规则过程的项目地址可以动态更新

前言

规则引擎是从推理引擎发展起来的、嵌入到APP应用程序中的组件,它将业务决策与APP应用程序代码分离,并使用预定义的语义模块创建业务决策。 接受数据输入,解释业务规则,并根据业务规则做出业务决策。

本文介绍了一个简单的SpringBoot Drools项目用例。 用例使用Drools规则引擎的无状态会话(StatelessKIESession )。 为了便于合成,某些代码将被删除,完整的代码可在“项目地址”中获得。

项目提供两个API接口。

引入运行规则引擎动态更新规则的依赖关系! --- drools---- dependencygroupidorg.drools/groupidartifactiddrools-compiler/artifactidversion7.4.1. final/一个会话可以对应多个drl文件。 会话是无状态会话,不使用推理,形成最简单的用例。

kasename=' first rules ' packages=' rules.first ' ksession name=' firstsession ' type=' stateless '//kbasekbasename=' second rules ' packages=' rules.second ' ksessionname=' second session ' type=' stateless '//kbase

rule ' mytest two ' dialect ' Java ' no-loop true lock-on-activetrueactivation-group ' mytest ' salience 30 when STD 3360 stu TTT

规则匹配two ' dialect ' Java ' no-loop true lock-on-activetrueactivation-group ' match ' salience 20 when STD 3360 stu dedeeence end执行规则引擎:传递的参数age=18,name=‘dtdxbw’。

@ API操作(value='运行规则引擎') publicbaseresponsestringexecutedrools ) { baseresponsestringresult=new base response .返回结果; }返回结果:

{

“message=‘”:“student { age=18,name=‘dtdxbw-成年’,message=‘匹配成功:优先级- 30’”

}

动态更新规则@ API操作(动态更新规则) publicbaseresponsestringupdatekiesession (request param ) ) value='type ' ) @ApiParam 请求列表(throws exception (baseresponsestringresult=new base response ); string list.add (kieupdateservice.readdrlbystream (stream ) ); result=kieUpdateService。

updateByFile(type, stringList); ... return result; }

复制规则一的drl文件到本地,在文件中增加加一条rule:

rule "myTest three"dialect "java"no-loop truelock-on-active true activation-group "myTest" salience 40when std:Student(age > 10)then std.setMessage(str + ":priority-40");end

传入本地的drl文件,动态更新session后再次执行规则引擎,返回结果如下:

{
“message”: “Student{age=18, name=‘dtdxbw-已成年’, message=‘匹配成功:priority-40’}”
}

动态更新规则过程 将输入的drl文件转变为字符串 public String readDrlByStream(InputStream inputStream) { ByteArrayOutputStream bos = null; try { bos = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int length; while ((length = inputStream.read(buffer)) != -1) { bos.write(buffer, 0, length); } return bos.toString(); } catch (IOException e) { LOGGER.error("Read file error"); } finally { try { if (bos != null) { bos.close(); } } catch (IOException e) { LOGGER.error("Close stream error"); } } return null; } 使用转为字符串的drl文件,更新指定名称的KieSession public boolean updateKieSession(String session, List<String> drlStrList) { //1.生成新的KieSession KieHelper helper = new KieHelper(); //添加传入规则 for (String str : drlStrList) { helper.addContent(str, ResourceType.DRL); } Results results = helper.verify(); if (results.hasMessages(Message.Level.WARNING, Message.Level.ERROR)) { List<Message> messages = results.getMessages(Message.Level.WARNING, Message.Level.ERROR); for (Message message : messages) { LOGGER.error("规则语法异常: {}", message.getText()); } throw new IllegalStateException("规则文件语法错误!"); } //生成StatelessKieSession对象,方法一 //KieBaseConfiguration configuration = helper.ks.newKieBaseConfiguration(); //configuration.setOption(EventProcessingOption.STREAM); //StatelessKieSession kieSession = helper.build(configuration).newStatelessKieSession(); //方法二 StatelessKieSession kieSession = helper.build(MultithreadEvaluationOption.YES).newStatelessKieSession(); //2.校验Kiesession KieSessionType kieSessionType = KieSessionType.getVaule(session); if (kieSessionType.equals(KieSessionType.OTHER)) { LOGGER.error("Session名称错误: " + session); return false; } //3.更新Kiesession kieContainerService.updateKieSession(kieSession, kieSessionType); return true; } 项目地址 https://gitee.com/enchanted-ys/drools-demo

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。