相关文章推荐
要出家的签字笔  ·  ERROR String length ...·  2 年前    · 
乐观的桔子  ·  c++ - ...·  2 年前    · 
* @throws IOException public File ruleTableConvertDRL(String ruleTablePath) throws IOException{ SpreadsheetCompiler compiler = new SpreadsheetCompiler(); File inFile = new File(ruleTablePath); File outFile = new File("e://outFile.txt"); InputStream xlsStream = null; OutputStream fos = null; OutputStreamWriter osw = null; BufferedWriter out = null; try { xlsStream = new FileInputStream(inFile); String strRule = compiler.compile(xlsStream, InputType.XLS); fos = new FileOutputStream(outFile); osw = new OutputStreamWriter(fos); out = new BufferedWriter(osw); out.write(strRule); out.flush(); System.out.println("\n" + strRule); } catch (IOException e) { throw new IOException("没找到文件或写入文件错误"); }finally{ xlsStream.close(); fos.close(); osw.close(); out.close(); return outFile; } 决策表:
package com.sinosoft.common.drools;
//generated from Decision Table
import com.sinosoft.ecif.scoreforgift.schema.model.FinalScore;
import com.sinosoft.ecif.scoreforgift.schema.model.ScoreInfo;
function void test(){
System.out.println("System.out.println()");
// rule values at B11, header at B6
rule "Fc_11"
		$finalScore:FinalScore(years == "0")
		$finalScore.setScore($finalScore.getScore()+100);
// rule values at B12, header at B6
rule "Fc_12"
		$finalScore:FinalScore(years == "1", arglossRatio>=0,arglossRatio<20)
		$finalScore.setScore($finalScore.getScore()+50);
// rule values at B13, header at B6
rule "Fc_13"
		$finalScore:FinalScore(years == "1", arglossRatio>=20,arglossRatio<50)
		$finalScore.setScore($finalScore.getScore()+30);
// rule values at B14, header at B6
rule "Fc_14"
		$finalScore:FinalScore(years == "1", arglossRatio>=50,arglossRatio<101)
		$finalScore.setScore($finalScore.getScore()+0);
// rule values at B15, header at B6
rule "Fc_15"
		$finalScore:FinalScore(years == "2", arglossRatio>=0,arglossRatio<20)
		$finalScore.setScore($finalScore.getScore()+100);
// rule values at B16, header at B6
rule "Fc_16"
		$finalScore:FinalScore(years == "2", arglossRatio>=20,arglossRatio<50)
		$finalScore.setScore($finalScore.getScore()+60);
// rule values at B17, header at B6
rule "Fc_17"
		$finalScore:FinalScore(years == "2", arglossRatio>=50,arglossRatio<101)
		$finalScore.setScore($finalScore.getScore()+0);
// rule values at B18, header at B6
rule "Fc_18"
		$finalScore:FinalScore(years == "3", arglossRatio>=0,arglossRatio<20)
		$finalScore.setScore($finalScore.getScore()+150);
// rule values at B19, header at B6
rule "Fc_19"
		$finalScore:FinalScore(years == "3", arglossRatio>=20,arglossRatio<50)
		$finalScore.setScore($finalScore.getScore()+90);
// rule values at B20, header at B6
rule "Fc_20"
		$finalScore:FinalScore(years == "3", arglossRatio>=50,arglossRatio<101)
		$finalScore.setScore($finalScore.getScore()+0);

说一下我在编辑决策表时遇到的问题:

1、RuleTable之前对决策表的声明中,最后一行的声明不能合并单元格,否则,此声明之前的所有声明都不会被解析。

如我的例子中,最后一个声明是第四行的functions,functions的方法体必须在一个单元格中,不能向后合并单元格。

2、ACTION列中,如果没有对象类型声明,则执行体的句末必须加上分号“;”,如果有对象类型声明,则可以不加。

如我的例子中,如果第8行的ACTION列中没有声明$finalScore,则下面的执行体必须加上分号,否则会报语法错误。

3、注意解析后的规则中的条件部分,years=="3",arglossRadio>=50,arglossRadio<101.用值替代的方法,显示的就是数字,用简单的单元值代入,显示的是字符串,但却不影响程序的正常运行。

4、RuleSet对应的就是drl文件中的package。

5、drools6需要高版本的poi依赖包,我用的是poi-3.5,一直提示没有isInRange方法,换做poi-3.9解决。


KnowledgeBuilder:作用就是用来在业务代码当中收集已经编写好的规则, 然后对这些规则文件进行编译, 最终产生一批编译好的规则包(KnowledgePackage)给其它的应用程序使用。 KnowledgeBuilder 和规则的区别是:规则是匹配到了条件之后,执行then后面的代码,query匹配到了之后将匹配到的fact对象返回到一个结果集,通过kie可以获取。也可以在rule中使用。类似于java类中的import,可以引用java类,此时用法与java代码中的import一致,也可以引用静态方法,这点和java代码有区别。类似于java类中的package,当drl文件存放的路径与drl文件中的package定义不同时,类似于java类中的私有方法,function只能在drl当前文件内调用,算是一种“私有”方法。 决策表Drools规则引擎的重要应用场景之一。如果你学习了基础的Drools语法知识,想进一步精通Drools规则引擎中决策的表的详细使用;如果你在实践中大量用到决策表;那么,这套课程会帮你通过实战的角度分析各种决策表的语法和使用场景,帮你节省学习成本,提升使用效率。同时,在课程中还提供了相应的一些实战小技巧,帮你更加灵活,精通的使用Drools规则引擎的决策表。 在之前的文章中,我们的业务规则都是写在了`drl`文件中,这对开发人员来说是没有什么问题,如果是业务人员则不怎么友好,这篇文章我们简单学习一下`drools`中决策表的使用,规则是写在`excel`文件中。 Drools除了支持drl形式的文件外还支持xls格式的文件(即Excel文件)。这种xls格式的文件通常称为决策表(decision table)。 决策表(decision table)是一个“精确而紧凑的”表示条件逻辑的方式,非常适合商业级别的规则决策表与现有的drl文件可以无缝替换。Drools提供了相应的API可以将xls文件编译为drl格式的字符串 一个决策表的例子如下: 决策表的语法: RuleSet 相当于drlDrools 决策表的使用决策表简介引用官方的话 决策表是一个“精确而紧凑的”表示条件逻辑的方式,非常适合商业级别的规则。 目前决策表支持xls格式和csv格式。决策表与现有的drools drl文件使用可以无缝替换。 什么时候使用决策表 规则能够被表达为模板+数据的格式,考虑使用决策表 很少量的规则不建议使用决策表 不是遵循一组规则模板的规则也不建议使用决策表 决策表格式RuleSet 一个典型的DRL文件: [code="java"]①package com.sample //包名,不可以与关键字冲突 ②import com.sample.DroolsTest.Message;//本文件需要导入的类 ③global java.util.List myGlobalList;//全局变量 ④//定义函数体 function String hello(String na... 关于Drools规则引擎,之前已经写了几篇相关文章,如果大家不熟悉的可以移步了解下:本篇博客主要为大家列举一些常用,简单的drl文件,帮助大家更加深入地了解其drl文件地编写格式及常用的操作符说明:每个 drl 都必须声明一个包名,这个包名与 Java 里面的不同,它不需要与文件夹的层次结构一致,主要用于可以根据kmodule.xml中不同的package属性来指定加载哪个.drl文件,packa... 在Windows世界中,有无数块活动的大陆,它们都有一个共同的名字——动态链接库。现在就走进这些神奇的活动大陆,找出它们隐藏已久的秘密吧!   初窥门径:Windows的基石  随便打开一个系统目录,一眼望去就能看到很多扩展名DLL的文件,这些就是经常说的“动态链接库”,DLL是Dynamic Link Library(即“动态链接库”)的缩写。从Microsoft公司推出首个版本的Win JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++),允许Java代码和其他语言写的代码进行交互的一种机制,JNI支持一个“调用接口”(invocation interface),它允许你把一个JVM嵌入到本地程序中。本地程序可以链接一个实现了JVM的本地库,然后使用“调用接口”执行JAVA语言编写...    Drools 5 采用了原生的规则语言,那是一种非 XML 文本格式。在符号方面,这种格式是非常轻量的,它的应用非常简单。可以适用于比较复杂的业务逻辑,本例是用于计费系统的批价,粗略来说,有按次收费,按月收费,按照流量收费,又根据前提不同,使用不同的优惠策略,比如购买了某产品赠送800通话实践100分钟,又有可能根据当月实际使用天数赠送一定的通话时长。如此复杂场景使用规则引擎再好不过了,将动... Drools规则引擎是一种嵌套在应用程序中的组件,它实现了将业务规则从应用程序代码中分离出来。本次课程的主要内容分为以下几个方面:1.规则引擎、 Drools规则引擎简介2.Drools规则引擎各类基础知识点讲解,如kmodule、no-loop、salience等3.各类基础函数以及决策表,动态加载规则4.实战式教学以及课程总结