zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    matplotlib 进阶之origin and extent in imshow
    Momentum and NAG
    matplotlib 进阶之Tight Layout guide
    matplotlib 进阶之Constrained Layout Guide
    matplotlib 进阶之Customizing Figure Layouts Using GridSpec and Other Functions
    matplotlb 进阶之Styling with cycler
    matplotlib 进阶之Legend guide
    Django Admin Cookbook-10如何启用对计算字段的过滤
    Django Admin Cookbook-9如何启用对计算字段的排序
    Django Admin Cookbook-8如何在Django admin中优化查询
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5123292.html
Copyright © 2011-2022 走看看