drools6 基本使用 -- 2
续drools6 基本使用1
http://blog.csdn.net/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
drools6 基本使用 -- 2的更多相关文章
- Eclipse Mars 2安装Drools6.4插件(Drools and jBPM tools)时无法安装JBoss Runtime Drools Detector
在eclipse上本地安装Drools6.4Final的时候出现两个组件无法正常安装的情况,具体组件如下: 具体的提示信息为: Cannot complete the install because ...
- eclipse中配置drools6.5环境
1.去官网下载两个压缩包 2.解压两个压缩包,依次进入droolsjbpm-tools-distribution-6.5.0.Final\droolsjbpm-tools-distribution-6 ...
- 【java规则引擎】drools6.5.0中kie的概论
什么是KIE? KIE是jBoss里面一些相关项目的统称,下图就是KIE代表的一些项目,其中我们比较熟悉的就有jBPM和Drools. 这些项目都有一定的关联关系,并且存在一些通用的API,比如说涉及 ...
- 【java规则引擎】drools6.5.0版本中kmodule.xml解析
kmodule.xml文件存放在src/main/resources/META-INF/文件夹下. <?xml version="1.0" encoding="UT ...
- 【java规则引擎】drools6.5.0版本api简介
在有些术语使用的时候,我有时候会用KIE项目.KIE引擎或者Drools项目.Drools引擎,大家应该理解KIE是Drools等项目的一个统称,所以在大多数情况下KIE或者特指Drools都是差不多 ...
- drools6
<dependency> <groupId>org.drools</groupId> <artifactId>drools-core</artif ...
- Drools6:规则互斥
在Drools中,有的时候会出现一种情况,一个事实Fact,满足了两个规则. 比如Fact的POJO是下面的 public class Message { public static final in ...
- 【转】外部应用和drools-wb6.1集成解决方案
一.手把手教你集成外部应用和drools workbench6.1 1. 首先按照官方文档安装workbench ,我用的是最完整版的jbpm6-console的平台系统,里面既包含j ...
- 安装DRools开发环境
1.下载相关安装包和开发插件 网站:http://www.jboss.org/drools/downloads.html 1.1 drools-distribution-6.3.0.Final.zip ...
随机推荐
- 数据挖掘 决策树算法 ID3 通俗演绎
决策树是对数据进行分类,以此达到预測的目的.该决策树方法先依据训练集数据形成决策树,假设该树不能对全部对象给出正确的分类,那么选择一些例外添�到训练集数据中,反复该过程一直到形成正确的决策集.决策树代 ...
- Graphviz 绘制流程图
凝视说明非常具体.不再详述. digraph G{ //dot 是一种画图语言,它能够方便你採用图形的方式高速.直观地表达一些想法, //比方描写叙述某个问题的解决方式,构思一个程序的流程,澄清一堆貌 ...
- java中怎么终止一个线程的执行----个人学习心得
参考了一下两个网站的介绍: ①:http://blog.csdn.net/liuhanhan512/article/details/7077601 ②:http://www.blogjava.net/ ...
- 【OpenCV新手教程之十三】OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔与图片尺寸缩放
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/26157633 作者:毛星云(浅墨) ...
- SQL server 2000安装时“以前的某个程序安装已在安装计算机上创建挂起”
客户使用的固定资产盘点软件使用的数据库是MSSQL 2000,在安装完成打上SP3的时候提示“以前的某个程序安装已在安装计算机上创建挂起的文件操作.运行安装程序之前必须重新启动计算机“,从客户的软件提 ...
- hdu3804(树链剖分)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3804 题意:给定一棵n个结点的树及边权,回答m个询问(x,y)满足以下条件的边权: 1)该边在结点1~ ...
- MySQL的一些基本操作
近期開始学习MySQL,主要是通过书籍,和看燕十八老师的视频,然后通过博客记录自己的学习过程. 登入数据库 zhiniaobu@telunsu-K55VD:~$ mysql -uroot -p Ent ...
- 辛星分析html中间name和id
差额
朋友们可以新手也能很容易区分id和class,但不一定很容易区分id和name,以下说一下二者的差别和联系. 首先是联系,它们都能够用来标记一个元素,并且能够用JavaScript来操作,可是操作方法 ...
- MySQL数据转移至MSSQL详解
一.安装MySQL ODBC驱动 为MySQL安装Connector/ODBC驱动.在此需要注意的一点是Connector/ODBC驱动与MySQL Server的版本对应问题. 二.创建系统DS ...
- Conversion to Dalvik format failed with error 1
主要和添�的第三方的包有关系. ======================================= 出现,Conversion to Dalvik format failed with e ...