drools6 基本使用 -- 2

大疆C板使用C610电调驱动M2006电机(hal库) 大疆C板使用C610电调驱动M2006电机,以及遇到代码没问题,但是电机死活不转的处理 阅读详情

续drools6 基本使用1

http://blog.youkuaiyun.com/cloud_ll/article/details/26979355

8. 创建src/main/test folder,把droolsTest.java移动到test folder,把droolsTest.java改装成junit test case,执行mvn test,确保rules运行没有问题


9. 执行mvn install 把rules打包成jar文件上传到本地库


Note: 如果rule文件里面有中文,记得要把文件保存成utf-8格式,然后测试的时候保证maven的surefire plugin加上了使用utf-8的运行参数,否则会乱码出错


10. 在另外一个项目中使用drools,主要是借助kie-ci框架,实现启动load rules,动态修改rules和执行规则

maven文件改动,加入如下依赖:

<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-ci</artifactId>
</dependency

java代码:创建一个ruleservice接口和实现类,实现以下方法:启动load rules(initService),动态修改(refreshService), 执行规则(fireService)

	public void initService(String groupId, String artifactId, String version)  throws NotExistsException {
		ks = KieServices.Factory.get();
		try{
			kContainer = ks.newKieContainer(ks.newReleaseId(groupId, artifactId, version));
		} catch (Exception e){
			StringBuilder sb = new StringBuilder("fail to get maven rules kmodule from groupId: [");
			sb.append(groupId).append("] artifactId: [").append(artifactId).append("] version: [").append(version).append("]");
			throw new NotExistsException(sb.toString());
		}
		if(null != kContainer)
			kSession = kContainer.newStatelessKieSession("ksession-rules");
	}

	@Override
	public void refreshService(String groupId, String artifactId, String version) throws NotExistsException {
		try{
			kContainer.updateToVersion(ks.newReleaseId(groupId, artifactId, version));
		} catch (Exception e){
			StringBuilder sb = new StringBuilder("fail to get maven rules kmodule from groupId: [");
			sb.append(groupId).append("] artifactId: [").append(artifactId).append("] version: [").append(version).append("]");
			throw new NotExistsException(sb.toString());
		}
		if(null != kContainer)
			kSession = kContainer.newStatelessKieSession("ksession-rules");
	}

	@Override
	public void fireService(Message info) {
		kSession.execute(info);
	}

11. 基本测试,对于使用drools和直接写java代码,显然使用drools可以实现动态部署,更具优势,不过有人担心性能受到影响,这里我做了一下测试,

我这里的测试是基于一个自己写的rule规则,对对象的某些字段做业务逻辑处理,选择使用java代码和使用drools,看耗时差别,当然这个测试很简陋,也没有对drools使用做优化,也没有看CPU和内存使用情况

业务逻辑代码:

public void setMatchThresholdsInfo(CustomerInfo info) {
		String temp = info.getProfessionCode();
		// boolean flag = false;
		if (null == temp || 0 == (temp.trim()).length() || "其他".equals(temp) || "其它".equals(temp) || "无业".equals(temp) || "未知".equals(temp)) {
			info.setRiskValue(info.getRiskValue() + 20);
		    info.setRiskType(info.getRiskType() + " Invalid professionCode value: " + info.getProfessionCode());
		}
		if (info.getCertificateEndDate() == null
				|| info.getCertificateEndDate().before(new Date())) {
			 info.setRiskValue(info.getRiskValue() + 80);
		     info.setRiskType(info.getRiskType() + " Invalid Certification End date value: " + info.getCertificateEndDate());
		}
		if (info.getCustomerName() == null || info.getCustomerName().trim().length() == 0) {
			info.setRiskValue(info.getRiskValue() + 80);
			info.setRiskType(info.getRiskType() + " Customer Name is null");
		}
		if (info.getCertificateId() == null || 0 == (info.getCertificateId().trim()).length()) {
			info.setRiskValue(info.getRiskValue() + 80);
			 info.setRiskType(info.getRiskType() + " Invalid Certification ID: " + info.getCertificateId());
		}
		if (null == info.isForeignFlag() ||info.isForeignFlag()) {
			info.setRiskValue(info.getRiskValue() + 20);
			info.setRiskType(info.getRiskType() + " 境外标志: " + info.getForeignFlag());
		}
		
		info.setRiskType(info.getRiskType().trim());
	}
rule规则:

//created on: May 19, 2014
package com.elulian.CustomerSecurityManagementSystem.service.impl

//list any import classes here.
import com.elulian.CustomerSecurityManagementSystem.vo.CustomerInfo
import java.util.Date

//declare any global variables here

rule "Profession Rule"
       //include attributes such as "salience" here... 
       
    when
       //conditions
       info : CustomerInfo (null == professionCode || 0 == (info.getProfessionCode().trim()).length() || "其他".equals(professionCode) || "其它".equals(professionCode) || "无业".equals(professionCode) || "未知".equals(professionCode))
    then
       //actions
       info.setRiskValue(info.getRiskValue() + 20);
       info.setRiskType(info.getRiskType() + " Invalid professionCode value: " + info.getProfessionCode());
end

rule "Certification End date Rule"
       
    when
        //conditions
        info : CustomerInfo (null == certificateEndDate || certificateEndDate.before(new Date()))
    then
        //actions
       info.setRiskValue(info.getRiskValue() + 80);
       info.setRiskType(info.getRiskType() + " Invalid Certification End date value: " + info.getCertificateEndDate());

end

rule "Customer Name Rule"
        
    when
        //conditions
         info : CustomerInfo (null == customerName || 0 == (info.getCustomerName().trim()).length())
    then
        //actions
         info.setRiskValue(info.getRiskValue() + 80);
         info.setRiskType(info.getRiskType() + " Customer Name is null");

end

rule "Certification ID Rule"
       
    when
        //conditions
        info : CustomerInfo (null == certificateId || 0 == (info.getCertificateId().trim()).length())
    then
        //actions
        info.setRiskValue(info.getRiskValue() + 80);
        info.setRiskType(info.getRiskType() + " Invalid Certification ID: " + info.getCertificateId());
end

/*
rule "Certification ID Rule 2"
   
    when
        //use regx here to check digital and length later
        info : CustomerInfo ("身份证" == certificateType && (15 != (info.getCertificateId().trim()) || 18 != (info.getCertificateId().trim())))
    then
        info.setRiskValue(info.getRiskValue() + 80);
        info.setRiskType(info.getRiskType() + " Invalid Certification ID: " + info.getCertificateId());
end
*/        

rule "Foregin Flag Rule"
        
    when
        info : CustomerInfo (null == foreignFlag || true == foreignFlag)
    then
        //actions
        info.setRiskValue(info.getRiskValue() + 20);
        info.setRiskType(info.getRiskType() + " 境外标志: " + info.getForeignFlag());
end

//execute after all other rules are fired
rule "Trim Risk Type Rule"
    salience -9999
    when 
        info : CustomerInfo (true)
    then 
        info.setRiskType(info.getRiskType().trim());
end

测试代码:

@Test
	public void testExeuctionTime(){
		long recordsNumber = 100000;
		long start = System.currentTimeMillis();
		long used = 0;
		for(int i = 0; i < recordsNumber ; i++){
			CustomerInfo info = new CustomerInfo();
			info.setRiskType("");
			info.setRiskValue(0);
			thresholdService.setCustomerThresholdsInfo(info);
		}
		used = System.currentTimeMillis() - start;
		System.out.println(used);
		
		start = System.currentTimeMillis();
		used = 0;
		for(int i = 0; i < recordsNumber; i++){
			CustomerInfo info = new CustomerInfo();
			info.setRiskType("");
			info.setRiskValue(0);
			thresholdService.setMatchThresholdsInfo(info);
		}
		used = System.currentTimeMillis() - start;
		System.out.println(used);
	}

测试结果:

recordsNumber = 10

54
424

recordsNumber = 100

23
713
[Thread-3] WARN org.drools.core.rule.constraint.MvelConstraint - Exception jitting: null == certificateEndDate || certificateEndDate.before(
new Date()) This is NOT an error and NOT prevent the correct execution since the constraint will be evaluated in intrepreted mode
[Thread-4] WARN org.drools.core.rule.constraint.MvelConstraint - Exception jitting: null == customerName  ||  0 == (info.getCustomerName().t
rim()).length() This is NOT an error and NOT prevent the correct execution since the constraint will be evaluated in intrepreted mode
[Thread-2] WARN org.drools.core.rule.constraint.MvelConstraint - Exception jitting: null == professionCode || 0 == (info.getProfessionCode()
.trim()).length() || "鍏朵粬".equals(professionCode) || "鍏跺畠".equals(professionCode) || "鏃犱笟".equals(professionCode) || "鏈煡".equal
s(professionCode) This is NOT an error and NOT prevent the correct execution since the constraint will be evaluated in intrepreted mode
[Thread-5] WARN org.drools.core.rule.constraint.MvelConstraint - Exception jitting: null == certificateId  ||  0 == (info.getCertificateId()
.trim()).length() This is NOT an error and NOT prevent the correct execution since the constraint will be evaluated in intrepreted mode

recordsNumber = 10000

406

70937

更多rules warning。。。。。。。。有机会和时间要研究下如何调优


加几句,一不小心用了spring tx adv,慢的更离谱了

INFO - init threshold service before test
83813
[Thread-4] WARN org.drools.core.rule.constraint.MvelConstraint - Exception jitting: null == certificateEndDate || certificateEndDate.before(new Date()) This is NOT an error and NOT prevent the cor
[Thread-3] WARN org.drools.core.rule.constraint.MvelConstraint - Exception jitting: null == professionCode || 0 == (info.getProfessionCode().trim()).length() || "鍏朵粬".equals(professionCode) ||
[Thread-5] WARN org.drools.core.rule.constraint.MvelConstraint - Exception jitting: null == customerName  ||  0 == (info.getCustomerName().trim()).length() This is NOT an error and NOT prevent the
[Thread-6] WARN org.drools.core.rule.constraint.MvelConstraint - Exception jitting: null == certificateId  ||  0 == (info.getCertificateId().trim()).length() This is NOT an error and NOT prevent t
146309
Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 343.06 sec - in com.elulian.CustomerSecurityManagementSystem.service.ThresholdServiceTest
Running com.elulian.CustomerSecurityManagementSystem.service.UserInfoServiceTest

MC_SetOverride指令详细应用介绍(基恩士PLC) 基恩士KV系列PLC和松下总线绝对值伺服运动控制(详细配置+轴控完整ST源代码) 阅读详情

相关推荐

【iOS开发】dyld: Symbol not found: ___chkstk_darwin 问题解决

【iOS开发】dyld: Symbol not found: ___chkstk_darwin 问题解决 Xcode 13.2.1 运行到iOS12.x版本上崩溃报错如下:dyld: Symbol not found: ___chkstk_darwin dyld: Symbol not found: ___chkstk_darwin Referenced from: /private/var/containers/Bundle/Application/A424CEFD-51DB-450E-9D62-B8

wm9028的专栏 6563

现代C++编程实战14-SFINAE:不是错误的替换失败是怎么回事

你好,我是吴咏炜。我们已经连续讲了两讲模板和编译期编程了。今天我们还是继续这个话题,讲的内容是模板里的一个特殊概念——替换失败非错(substitution failure is not an error),英文简称为 SFINAE。

fegus的博客 612

从Live2D到Unreal Engine:2D与3D虚拟数字人核心技术实现路径解析

本文深入解析了从Live2D到Unreal Engine的2D与3D虚拟数字人核心技术实现路径,涵盖技术选型、制作流程与优化技巧。通过对比2D骨骼动画与3D建模渲染的差异,结合实战案例,帮助开发者根据项目需求选择合适方案,提升虚拟数字人的交互体验与视觉效果。

weixin_30379531的博客 149

Drools 5.3、5.5掉坑总结

1. Exception in thread "Thread-52" java.lang.RuntimeException: Null accessor on node 原因未知,不用管,不会影响规则的触发。 这个问题一般是在第20次运行的时候出来 2. 出现以下异常 ``` 异常一、java.lang.RuntimeException: Exception jitting: 异常二、java.lang.VerifyError method: evaluate signature: ...

xuechangchun007的专栏 1148

YOLOv11【第二十章:模型迭代与生态闭环篇·第1节】在线增量学习——部署后新数据自动回流重训!

🏆 本文收录于专栏 《YOLOv11实战:从入门到深度优化》。本专栏围绕 YOLOv11 的改进、训练、部署与工程优化 展开,系统梳理并复现当前主流的 YOLOv11 实战案例与优化方案,内容目前已覆盖 分类、检测、分割、追踪、关键点、OBB 检测 等多个方向。

**My Coding Family** 432

流媒体之LL-HLS 低延时HLS协议

LL-HLS协议通过扩展了HLS协议,为实时直播场景提供了更丰富的功能,如延迟控制、播放列表增量更新、阻止播放列表重新加载等。同时客户端可以更灵活地控制播放列表的加载和播放,以适应各种场景和需求。LL-HLS在直播中的延时可以控制在3s内, 但是即使这样, 还是不如RTMP, RTSP等协议的实时性。

技术控的笔记 3365

drools处理实体对象中的map对象的校验获取数据的方式

drools处理实体对象中的map对象的校验获取数据的方式 实体对象 进入到drools进行校验 在drools中取出map并获取对应数据的写法为 when $solelyParamDto : SolelyParamDto( interfaceName == "test2" ) $paramDate : Map(get("aaa") == "456") from $solelyParamDto.getParamDate $pm22: Map(get("bbb") == "789") from

优快云JSGK的博客 1740

Dify基础:Dify平台的本地化部署(含windows部署中,常见问题及解决方案)

第一种比较简单,只需要在浏览器中,打入https://dify.ai/就可以。这个指令虽然看起来简单,但实际上涉及到对docker的使用。这个项目既然有github地址,那它一般就是开源的。我们点开这个github地址,便能看到dify的私有化部署方式。我们可以看到,还是上面那个图,有个按钮,是指向该项目的Github地址的。第二步:按照dify的github给出的指令,对dify进行安装。第一步:我们把dify下载到自己的电脑(或者服务器)上。这里,我们只考虑第二种方式,也就是私有化部署。

xiezhipu的博客 1万+

Drools.D.10:与Spring的集成

10.1. Drools 6.0的重要变化 Drools Spring集成已经经历了与Drools 6.0一致的彻底改变。以下是一些主要的变化 10.2. 与Drools Expert集成 在本节中,我们将解释kie名称空间。 10.2.1. KieModule kie:kmodule定义了KieBase和相关的KieSession的集合。kmodule标签有一个强制参数’id’。 kmodule标记只能包含以下标记作为子标记。 kie: kbase 参考Drools专家文档中的kmodule.xml文档

weixin_42486375的博客 655

从 AI 助手到 ADT 自动化桥梁:全面解析 Vibing Steampunk 的定位、能力边界与典型使用场合

Vibing Steampunk是一个面向SAP ABAP开发的AI自动化工具集,它通过ADT API将SAP开发能力系统化地暴露给AI助手和命令行工作流。该工具支持ECC、S/4HANA等所有启用ADT的系统,提供代码读取、修改、测试、调试等全流程自动化能力。核心功能包括AI调试、上下文压缩、ABAP语言服务、Lua脚本自动化等,并内置多重安全控制。其分层架构兼容标准ADT和WebSocket扩展,既适合AI驱动开发,也支持传统DevOps自动化,特别适用于老系统代码考古、知识接力和复杂问题诊断场景。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 152

基于Simulink的四足机器人关节力矩优化仿真建模示例

高自由度:每个腿至少有3个自由度(DOF),增加了控制的复杂性。非线性动力学:涉及多体系统的相互作用,包括接触力、摩擦力等。能量消耗:减少不必要的能量消耗是提升续航能力和效率的关键。可以是最小化能量消耗或最大化稳定性等。matlab深色版本% 示例代码通过本指南,我们介绍了如何基于Simulink搭建一个四足机器人的关节力矩优化模型,并进行了仿真以验证其基本功能。

amy_mhd的博客 171

drools_Drools 6.2.0.Final发布

drools 我们很高兴地宣布最新,最出色的Drools 6.2.0.Final版本。 特别是此发行版更加注重改进的可用性和功能,这些功能使项目更易于使用(和采用)。 新功能包括对工作台UI的大量改进,对社交活动和插件管理的支持以及规则的全新Execution Server。 改进的巫师 执行服务器管理UI 社交活动 贡献者仪表板 透视编辑器 ...

cunfu5234的博客 146

英飞凌 AURIX TC3XX 系列单片机的链接文件

这篇介绍英飞凌 AURIX TC3XX 系列单片机的链接文件,主要是针对使用 SOTA 功能如何修改链接文件,完整地实现 SOTA 功能

大橙子的博客 4385

drools6.5_Drools 6.2.0.Final发布

drools6.5 我们很高兴地宣布最新,最出色的Drools 6.2.0.Final版本。 特别是此发行版更加注重改进的可用性和功能,这些功能使项目更易于使用(和采用)。 新功能包括对工作台UI的大量改进,对社交活动和插件管理的支持以及规则的全新Execution Server。 改进的巫师 执行服务器管理UI 社交活动 贡献者仪表板 透视...

最佳 Java 编程 170

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Drools 6.2.0.Final发布

我们很高兴宣布最新,最出色的Drools 6.2.0.Final版本。 特别是此发行版更加注重改进的可用性和功能,这些功能使项目更易于使用(和采用)。 新功能包括对工作台UI的大量改进,对社交活动和插件管理的支持以及规则的全新Execution Server。 改进的巫师 执行服务器管理UI 社交活动 贡献者仪表板 透视编辑器 这里有...

最佳 Java 编程 174

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

java drools 权限_java – 版本6.2的drools代码不推荐使用

我有一个旧的和已删除的drools代码,这段代码可以读取容器外的规则文件(drl),并且可以使用任何Value Object和任何类.CommandExecutor ksession;KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();String file = System.getenv("DOMAI...

weixin_42300175的博客 226

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Drools 6.2.0 Workbench 部署

Drools 6.2.0  Workbench 部署 drools 6.2.0 workbench 是 drools的一个web端的开发平台。 由于 drools是 jboss下面的开源项目,所以使用jboss服务器来部署是最简单的。 下面说明使用tomcat部署drools wb的步骤。  一、官网下载 drools -workbench ,地址:http://download.

Cx的博客 885

Drools6.2官方文档,尝试翻译

Read The Fucking Source Code 研究过几款CEP引擎,最近刚完成StreamBase研究报告,深感英语四级的无奈。整个过程几乎全靠官方自助文档,网上资料少之又少,但是最后还是翻译好20多个功能模块,并能大概懂怎么把弄。 借着之前的经验,现在我还要写一份Drools的研究报告,网上查过资料,出乎我意外,开源的东西就是好,很多文章。我收集很多

Maksim的博客 430

[翻译]Drools6.2帮助文档-目录

源地址:http://docs.jboss.org/drools/release/6.2.0.Final/drools-docs/html/index.html 若有侵权,请致电babydrool on 163.com 转载请注明babydrool from ITEye I.欢迎 1.简介 1.1.介绍 1.2.参与 1.2.1.注册以jboss.org 1.2.2.签署贡...

认清这个世界,然后爱它! 228

Drools6.2 Eclipse环境搭建及HelloWord

由于工作的需要,我开始学习Drools了,根据官网的介绍在Eclipse中搭建了Drools的开发环境. 环境: MacOS10.10 + EclipseLuna Drools版本: Drools6 1. 从官网下载以下两个zip包 . http://www.drools.org/download/download.html drools-distribution-6.2.

ywj776199845的专栏 1951

在tomcat下部署drools 6.2.0 workbench

drools 6.2.0 workbench 是 drools的一个web端的开发平台。 由于 drools是 jboss下面的开源项目,所以使用jboss服务器来部署是最简单的。 下面说明使用tomcat部署drools wb的步骤。  一、官网下载 drools -workbench ,地址:http://download.jboss.org/drools/release/6.2.0.F

hykjtt的专栏 7323

[翻译]Drools6.2帮助文档-9. Drools命令

 9.1. API Drools提供的XML序列化/反序列化命令需要使用特殊的类,这将会在下面的章节详细介绍。 下面示例脚本的网址,包括JAXB, Xstream, JSON的序列化: http://fisheye.jboss.org/browse/JBossRules/trunk/drools-camel/src/test/resources/org/droo

BuXuLianXiang的专栏 2196

drools 6学习2--伟大的hello world

IT界学习各新技术的第一个例子好像都喜欢hello world,那就从hello world开始吧。在此说明,这里用的drools是drools6,drools5和drools6还是有差别的,drools6可以说变得更简洁了。 建立个简单的maven项目  pom.xml org.drools drools-core 6.4.0.

夢の殇 2465

[翻译]Drools6.2帮助文档-9.Drools命令

9.1. API Drools提供的XML序列化/反序列化命令需要使用特殊的类,这将会在下面的章节详细介绍。 下面示例脚本的网址,包括JAXB, Xstream, JSON的序列化: • http://fisheye.jboss.org/browse/JBossRules/trunk/drools-camel/src/test/resources/org/drools/camel/compo...

认清这个世界,然后爱它! 324
上一篇: Drools6 基本使用 -- 1
下一篇: Java自带优秀工具
开心的D哥
博客等级 码龄22年 63粉丝 110原创
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值