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 ...
随机推荐
- ZOJ 3542 2011大连现场赛D题(简单模拟)
Hexadecimal View Time Limit: 2 Seconds Memory Limit: 65536 KB Hexadecimal is very important an ...
- c++windows内核编程笔记day12 硬盘逻辑分区管理、文件管理、内存管理
windows系统磁盘文件存储: 分区格式:NTFS / FAT32 GetSystemDirectory();//获取系统路径 GetWindowsDirectory();//获取windows路径 ...
- 使用FragmentTabhost取代Tabhost
如今Fragment使用越来越广了,尽管Fragment寄生在Activity下.可是它的出现对于开发人员来说是一件很幸运的事,使开发的效率更高效了.好了以下就说说 FragmentTabhos ...
- Cocos3d初探
预计要相当长的一段时间内研究游戏引擎,在这里做一下过程中的备忘. 上一周项目须要,研究了一下cocos2d-x,本周接着来做cocos3d-x的代码研究 首先是搭建cocos3d-x的开发环境: 依据 ...
- ad nbetmk57
http://www.zhihu.com/collection/24337307 http://www.zhihu.com/collection/24337259 http://www.zhihu.c ...
- Hbase配置中出现的问题总结
在create table的时候出现例如以下问题 1. ERROR: java.io.IOException: Table Namespace Manager not ready yet, try a ...
- Cocos2d-x精华教程汇总(第三期) cocos2d-x最新离线API文档下载(最新版3.6更新。。。)
其实使用doxygen在Cocos2d-x引擎的doc目录下可以生成离线文档,但是可能每个人为了生成一个离线文档去安装甚至编译doxygen毕竟麻烦,而且现有的doxygen无法生成多语言版本的离线文 ...
- android各种资源的详细解释
1.字符数组 使用字符串数组资源<string-array>标签定义,在<string-array>包括一些标签<item>数组元素标记. 例如 &l ...
- .NET开发必看资料53个+经典源码77个
目录0豆下载:http://down.51cto.com/data/426019 附件预览: 基于.net构架的留言板项目大全源码 http://down.51cto.com/zt/70 ASP.ne ...
- ajax相关体会
参考原文: 例子:http://blog.csdn.net/beijiguangyong/article/details/7725596 原理讲解:http://www.cnblogs.com/min ...