﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-断点-随笔分类-Drools</title><link>http://www.blogjava.net/tfzhu/category/44249.html</link><description>每天进步一点点！</description><language>zh-cn</language><lastBuildDate>Tue, 05 Oct 2010 13:24:36 GMT</lastBuildDate><pubDate>Tue, 05 Oct 2010 13:24:36 GMT</pubDate><ttl>60</ttl><item><title>java.lang.NullPointerException</title><link>http://www.blogjava.net/tfzhu/archive/2010/10/05/333750.html</link><dc:creator>断点</dc:creator><author>断点</author><pubDate>Mon, 04 Oct 2010 16:39:00 GMT</pubDate><guid>http://www.blogjava.net/tfzhu/archive/2010/10/05/333750.html</guid><wfw:comment>http://www.blogjava.net/tfzhu/comments/333750.html</wfw:comment><comments>http://www.blogjava.net/tfzhu/archive/2010/10/05/333750.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tfzhu/comments/commentRss/333750.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tfzhu/services/trackbacks/333750.html</trackback:ping><description><![CDATA[<p><span style="color: red">java.lang.NullPointerException<br />
</span>&nbsp;at jxl.read.biff.File.&lt;init&gt;(File.java:77)<br />
&nbsp;at jxl.Workbook.getWorkbook(Workbook.java:250)<br />
&nbsp;at jxl.Workbook.getWorkbook(Workbook.java:235)<br />
&nbsp;at org.drools.decisiontable.parser.xls.ExcelParser.parseFile(ExcelParser.java:76)<br />
&nbsp;at org.drools.decisiontable.SpreadsheetCompiler.compile(SpreadsheetCompiler.java:89)<br />
&nbsp;at org.drools.decisiontable.SpreadsheetCompiler.compile(SpreadsheetCompiler.java:68)<br />
&nbsp;at com.sample.DecisionTableTest.readDecisionTable(DecisionTableTest.java:59)<br />
&nbsp;at com.sample.DecisionTableTest.main(DecisionTableTest.java:36)<br />
<br />
Drools调用readDecisionTable()方法里面一处为：<br />
<span style="color: #0000ff">InputStream is = DecisionTableTest.class.getResourceAsStream("rules\\Sample.xls");<br />
final String drl = converter.compile( is, InputType.XLS );&nbsp;&nbsp;</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
需改为如下，取的class即错误解决。<br />
<span style="color: #0000ff">InputStream is = DecisionTableTest.class.getClassLoader().getResourceAsStream("rules\\Sample.xls");<br />
final String drl = converter.compile( is, InputType.XLS );</span></p>
<img src ="http://www.blogjava.net/tfzhu/aggbug/333750.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tfzhu/" target="_blank">断点</a> 2010-10-05 00:39 <a href="http://www.blogjava.net/tfzhu/archive/2010/10/05/333750.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>org.mvel.CompileException: can not resolve identifier: 'declr'</title><link>http://www.blogjava.net/tfzhu/archive/2010/10/05/333749.html</link><dc:creator>断点</dc:creator><author>断点</author><pubDate>Mon, 04 Oct 2010 16:32:00 GMT</pubDate><guid>http://www.blogjava.net/tfzhu/archive/2010/10/05/333749.html</guid><wfw:comment>http://www.blogjava.net/tfzhu/comments/333749.html</wfw:comment><comments>http://www.blogjava.net/tfzhu/archive/2010/10/05/333749.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tfzhu/comments/commentRss/333749.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tfzhu/services/trackbacks/333749.html</trackback:ping><description><![CDATA[<span style="color: red">org.mvel.CompileException: can not resolve identifier: 'declr'</span><br />
&nbsp;at org.mvel.ASTNode.getReducedValue(ASTNode.java:315)<br />
&nbsp;at org.mvel.ast.PropertyASTNode.getReducedValue(PropertyASTNode.java:29)<br />
&nbsp;at org.mvel.MVELInterpretedRuntime.parseAndExecuteInterpreted(MVELInterpretedRuntime.java:103)<br />
&nbsp;at org.mvel.MVELInterpretedRuntime.parse(MVELInterpretedRuntime.java:51)<br />
&nbsp;at org.mvel.TemplateInterpreter.execute(TemplateInterpreter.java:428)<br />
&nbsp;at org.mvel.TemplateInterpreter.parse(TemplateInterpreter.java:320)<br />
&nbsp;at org.drools.rule.builder.dialect.java.AbstractJavaBuilder.generatTemplates(AbstractJavaBuilder.java:113)<br />
&nbsp;at org.drools.rule.builder.dialect.java.JavaConsequenceBuilder.build(JavaConsequenceBuilder.java:95)<br />
&nbsp;at org.drools.rule.builder.RuleBuilder.build(RuleBuilder.java:67)<br />
&nbsp;at org.drools.compiler.PackageBuilder.addRule(PackageBuilder.java:446)<br />
&nbsp;at org.drools.compiler.PackageBuilder.addPackage(PackageBuilder.java:304)<br />
&nbsp;at org.drools.compiler.PackageBuilder.addPackageFromDrl(PackageBuilder.java:167)<br />
&nbsp;at com.sample.DecisionTableTest.readDecisionTable(DecisionTableTest.java:63)<br />
&nbsp;at com.sample.DecisionTableTest.main(DecisionTableTest.java:36)<br />
<br />
<span style="color: #0000ff">替换mvel.jar为mvel14-1.2.10.jar后不再报错，好像是jar包的问题。<br />
看了下jar包里面的org.mvel.ASTNode.getReducedValue方法已经注释掉了。</span>
<img src ="http://www.blogjava.net/tfzhu/aggbug/333749.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tfzhu/" target="_blank">断点</a> 2010-10-05 00:32 <a href="http://www.blogjava.net/tfzhu/archive/2010/10/05/333749.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WARNING: Wasn't able to correctly close stream for decision table. nulljava.lang.NullPointerException</title><link>http://www.blogjava.net/tfzhu/archive/2010/10/05/333747.html</link><dc:creator>断点</dc:creator><author>断点</author><pubDate>Mon, 04 Oct 2010 16:22:00 GMT</pubDate><guid>http://www.blogjava.net/tfzhu/archive/2010/10/05/333747.html</guid><wfw:comment>http://www.blogjava.net/tfzhu/comments/333747.html</wfw:comment><comments>http://www.blogjava.net/tfzhu/archive/2010/10/05/333747.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tfzhu/comments/commentRss/333747.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tfzhu/services/trackbacks/333747.html</trackback:ping><description><![CDATA[<span style="color: red">WARNING: Wasn't able to correctly close stream for decision table. nulljava.lang.NullPointerException</span><br />
&nbsp;at jxl.read.biff.File.&lt;init&gt;(File.java:77)<br />
&nbsp;at jxl.Workbook.getWorkbook(Workbook.java:250)<br />
&nbsp;at jxl.Workbook.getWorkbook(Workbook.java:235)<br />
&nbsp;at org.drools.decisiontable.parser.xls.ExcelParser.parseFile(ExcelParser.java:76)<br />
&nbsp;at org.drools.decisiontable.SpreadsheetCompiler.compile(SpreadsheetCompiler.java:89)<br />
&nbsp;at org.drools.decisiontable.SpreadsheetCompiler.compile(SpreadsheetCompiler.java:68)<br />
&nbsp;at org.drools.decisiontable.SpreadsheetCompiler.compile(SpreadsheetCompiler.java:110)<br />
&nbsp;at com.sample.DecisionTableTest.readDecisionTable(DecisionTableTest.java:57)<br />
&nbsp;at com.sample.DecisionTableTest.main(DecisionTableTest.java:35)<br />
<br />
在web项目中的原先的写法为：<br />
<span style="color: #0000ff">final String drl = converter.compile( "rules\\Sample.xls", InputType.XLS );</span><br />
<br />
参考了下别人的写法，改为下面的方式进行处理：&nbsp;&nbsp;<br />
<span style="color: #0000ff">InputStream is = DecisionTableTest.class.getClassLoader().getResourceAsStream("rules\\Sample.xls");<br />
final String drl = converter.compile( is, InputType.XLS );</span>
<img src ="http://www.blogjava.net/tfzhu/aggbug/333747.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tfzhu/" target="_blank">断点</a> 2010-10-05 00:22 <a href="http://www.blogjava.net/tfzhu/archive/2010/10/05/333747.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MyEclipse 8.5 + drools-5.1.1 的整合</title><link>http://www.blogjava.net/tfzhu/archive/2010/10/04/333727.html</link><dc:creator>断点</dc:creator><author>断点</author><pubDate>Mon, 04 Oct 2010 04:00:00 GMT</pubDate><guid>http://www.blogjava.net/tfzhu/archive/2010/10/04/333727.html</guid><wfw:comment>http://www.blogjava.net/tfzhu/comments/333727.html</wfw:comment><comments>http://www.blogjava.net/tfzhu/archive/2010/10/04/333727.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tfzhu/comments/commentRss/333727.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tfzhu/services/trackbacks/333727.html</trackback:ping><description><![CDATA[由于drools有新版本了，所以与MyEclipse整合进行了解下。<br />
整合步骤如下：<br />
1、下载MyEclipse 8.5；<br />
2、在http://www.jboss.org/drools/downloads.html下载Drools Eclipse 3.5 Workbench 5.1 插件；<br />
3、在E:\MyEclipse8.5下新建2个文件：links、myplugins。<br />
E:\MyEclipse 8.5\links：放drools.link配置文件，内容为path=E:\\MyEclipse 8.5\\myplugins\\drools\\<br />
E:\MyEclipse 8.5\myplugins：放drools文件，该E:\MyEclipse 8.5\myplugins\drools\eclipse下放置从网上下载的drools插件的features和plugins。<br />
4、重启MyEclipse 8.5即可看见drools图标。<br />
5、安装Jboss：下载jboss-5.0.0.GA，解压即可。<br />
打开MyEclipse-&gt;window-&gt;Preference-&gt;MyEclipse-&gt;Servers-&gt;JBoss-&gt;JBoss 5.x进行jre及相关配置。
<img src ="http://www.blogjava.net/tfzhu/aggbug/333727.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tfzhu/" target="_blank">断点</a> 2010-10-04 12:00 <a href="http://www.blogjava.net/tfzhu/archive/2010/10/04/333727.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Caused by: java.lang.RuntimeException: The Eclipse JDT Core jar is not in the classpath</title><link>http://www.blogjava.net/tfzhu/archive/2010/03/16/315537.html</link><dc:creator>断点</dc:creator><author>断点</author><pubDate>Mon, 15 Mar 2010 16:30:00 GMT</pubDate><guid>http://www.blogjava.net/tfzhu/archive/2010/03/16/315537.html</guid><wfw:comment>http://www.blogjava.net/tfzhu/comments/315537.html</wfw:comment><comments>http://www.blogjava.net/tfzhu/archive/2010/03/16/315537.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tfzhu/comments/commentRss/315537.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tfzhu/services/trackbacks/315537.html</trackback:ping><description><![CDATA[<p>在操作Drools的测试例子时，Eclipse后台报以下错误：<span style="color: #000000"><span style="color: #ff0000"><br />
org.drools.RuntimeDroolsException: Unable to load dialect 'org.drools.rule.builder.dialect.java.JavaDialectConfiguration:java'<br />
</span>&nbsp;at org.drools.compiler.PackageBuilderConfiguration.addDialect(PackageBuilderConfiguration.java:160)<br />
&nbsp;at org.drools.compiler.PackageBuilderConfiguration.buildDialectConfigurationMap(PackageBuilderConfiguration.java:146)<br />
&nbsp;at org.drools.compiler.PackageBuilderConfiguration.init(PackageBuilderConfiguration.java:121)<br />
&nbsp;at org.drools.compiler.PackageBuilderConfiguration.&lt;init&gt;(PackageBuilderConfiguration.java:98)<br />
&nbsp;at org.drools.compiler.PackageBuilder.&lt;init&gt;(PackageBuilder.java:124)<br />
&nbsp;at org.drools.compiler.PackageBuilder.&lt;init&gt;(PackageBuilder.java:86)<br />
&nbsp;at com.sample.DecisionTableTest.readDecisionTable(DecisionTableTest.java:58)<br />
&nbsp;at com.sample.DecisionTableTest.main(DecisionTableTest.java:35)<br />
<span style="color: #ff0000">Caused by: java.lang.RuntimeException: The Eclipse JDT Core jar is not in the classpath</span><br />
&nbsp;at org.drools.rule.builder.dialect.java.JavaDialectConfiguration.setCompiler(JavaDialectConfiguration.java:91)<br />
&nbsp;at org.drools.rule.builder.dialect.java.JavaDialectConfiguration.init(JavaDialectConfiguration.java:52)<br />
&nbsp;at org.drools.compiler.PackageBuilderConfiguration.addDialect(PackageBuilderConfiguration.java:156)<br />
&nbsp;... 7 more</span></p>
<br />
主要是缺少一个jar包：org.eclipse.jdt.core_3.3.1.v_780_R33x.jar而引起的。<br />
<img src ="http://www.blogjava.net/tfzhu/aggbug/315537.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tfzhu/" target="_blank">断点</a> 2010-03-16 00:30 <a href="http://www.blogjava.net/tfzhu/archive/2010/03/16/315537.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Drools 规则测试</title><link>http://www.blogjava.net/tfzhu/archive/2010/03/10/315101.html</link><dc:creator>断点</dc:creator><author>断点</author><pubDate>Wed, 10 Mar 2010 15:00:00 GMT</pubDate><guid>http://www.blogjava.net/tfzhu/archive/2010/03/10/315101.html</guid><wfw:comment>http://www.blogjava.net/tfzhu/comments/315101.html</wfw:comment><comments>http://www.blogjava.net/tfzhu/archive/2010/03/10/315101.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tfzhu/comments/commentRss/315101.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tfzhu/services/trackbacks/315101.html</trackback:ping><description><![CDATA[<p>package rules;</p>
<p>import java.io.InputStream;<br />
import java.io.StringReader;<br />
import java.util.ArrayList;<br />
import java.util.List;</p>
<p>import org.drools.RuleBase;<br />
import org.drools.RuleBaseFactory;<br />
import org.drools.WorkingMemory;<br />
import org.drools.compiler.PackageBuilder;<br />
import org.drools.decisiontable.InputType;<br />
import org.drools.decisiontable.SpreadsheetCompiler;<br />
import org.drools.rule.Package;</p>
<p><br />
public class TestPremium {<br />
&nbsp;public static final String path = "rules\\premium\\0326\\02\\030006\\rate.xls";<br />
&nbsp;<br />
&nbsp;public static void main(String[] args) throws Exception {<br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">RuleBase ruleBase = readDecisionTable();<br />
&nbsp;&nbsp;&nbsp;WorkingMemory workingMemory = ruleBase.newStatefulSession();<br />
</span>&nbsp;&nbsp;&nbsp;int flag = path.indexOf("FormulaOrder");&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;ElementResultVO r = new ElementResultVO();<br />
&nbsp;&nbsp;&nbsp;PremiumHelper helper = new PremiumHelper();<br />
&nbsp;&nbsp;&nbsp;workingMemory.setGlobal("r", r);<br />
&nbsp;&nbsp;&nbsp;workingMemory.setGlobal("helper", helper);<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;AppBaseVO base&nbsp; = new AppBaseVO();<br />
&nbsp;&nbsp;&nbsp;AppVhlVO vhl = new AppVhlVO();<br />
&nbsp;&nbsp;&nbsp;AppPrmCoefVO prmCoef = new AppPrmCoefVO();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;base.setCAmtCur("01");<br />
&nbsp;&nbsp;&nbsp;base.setNAmt(4000000d);<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;workingMemory.insert(base);<br />
&nbsp;&nbsp;&nbsp;workingMemory.insert(vhl);<br />
&nbsp;&nbsp;&nbsp;workingMemory.insert(prmCoef);<br />
&nbsp;&nbsp;&nbsp;<br />
<span style="color: #0000ff">&nbsp;&nbsp;&nbsp;workingMemory.fireAllRules();</span><br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;System.out.println("==========compile success!===========");<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;} catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp;System.out.println("==========compile failure!===========");<br />
&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;}<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;private static RuleBase readDecisionTable() throws Exception {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;final SpreadsheetCompiler converter = new SpreadsheetCompiler();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;InputStream is = TestPremium.class.getClassLoader().getResourceAsStream(path);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">&nbsp;final String drl = converter.compile( is, InputType.XLS );<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PackageBuilder builder = new PackageBuilder();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;builder.addPackageFromDrl( new StringReader( drl ) );<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Package pkg = builder.getPackage();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">RuleBase ruleBase = RuleBaseFactory.newRuleBase();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ruleBase.addPackage( pkg );<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return ruleBase;<br />
&nbsp;}</p>
<p>}<br />
<br />
++++++++++++++++++++++++++++++++++++++<br />
执行后的一部分：<br />
<span style="color: #0000ff">#From row number: 369<br />
rule "_369"<br />
&nbsp; salience 65167<br />
&nbsp; activation-group "x"<br />
&nbsp;when<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vhl:AppVhlVO(CUsageCde == "374015", CVhlTyp == "365012",&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eval(helper.getVhlYear(vhl.getCFstRegYm())&gt;=4&nbsp;&amp;&amp;&nbsp;helper.getVhlYear(vhl.getCFstRegYm())&lt;1000))<br />
&nbsp;then<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; r.putCoef("rate",0.67);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; r.putField("Table.col","Cvrg.NRate");<br />
end</span></p>
<img src ="http://www.blogjava.net/tfzhu/aggbug/315101.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tfzhu/" target="_blank">断点</a> 2010-03-10 23:00 <a href="http://www.blogjava.net/tfzhu/archive/2010/03/10/315101.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Drools读取Xsl文件</title><link>http://www.blogjava.net/tfzhu/archive/2010/03/10/315099.html</link><dc:creator>断点</dc:creator><author>断点</author><pubDate>Wed, 10 Mar 2010 14:29:00 GMT</pubDate><guid>http://www.blogjava.net/tfzhu/archive/2010/03/10/315099.html</guid><wfw:comment>http://www.blogjava.net/tfzhu/comments/315099.html</wfw:comment><comments>http://www.blogjava.net/tfzhu/archive/2010/03/10/315099.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tfzhu/comments/commentRss/315099.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tfzhu/services/trackbacks/315099.html</trackback:ping><description><![CDATA[<p>package com.premium.rules;</p>
<p>import java.io.File;<br />
import java.io.FileNotFoundException;<br />
import java.io.FileReader;<br />
import java.io.IOException;<br />
import java.io.InputStream;<br />
import java.io.Reader;<br />
import java.io.StringReader;<br />
import java.util.ArrayList;<br />
import java.util.HashMap;<br />
import java.util.Map;</p>
<p>import org.apache.log4j.Logger;<br />
import org.drools.compiler.DroolsParserException;<br />
import org.drools.compiler.PackageBuilder;<br />
import org.drools.decisiontable.InputType;<br />
import org.drools.decisiontable.SpreadsheetCompiler;<br />
import org.drools.rule.Package;</p>
<p>public class DrlPackageManager {</p>
<p>&nbsp;// 用于缓存Drools的Package，key为Excel的完整路径，value为此文件编译过后的Package<br />
&nbsp;static Map&lt;String, Package&gt; pkgMap = new HashMap&lt;String, Package&gt;();<br />
&nbsp;private static Logger logger = Logger.getLogger(DrlPackageManager.class);</p>
<p><br />
/**<br />
&nbsp; * 通过Excel的文件名缓存Drools的Package<br />
&nbsp; * <br />
&nbsp; * @param fileName<br />
&nbsp; * @return<br />
&nbsp; * @throws Exception<br />
&nbsp; */<br />
&nbsp;public static Package getPackageByXsl(String fileName) throws Exception {<br />
&nbsp;&nbsp;Package pkg = (Package) pkgMap.get(fileName);<br />
&nbsp;&nbsp;if (pkg != null)<br />
&nbsp;&nbsp;&nbsp;return pkg;</p>
<p>&nbsp;&nbsp;<span style="color: #0000ff">final SpreadsheetCompiler converter = new SpreadsheetCompiler();</span><br />
&nbsp;&nbsp;InputStream is = null;<br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">is = DrlPackageManager.class.getResourceAsStream(fileName);</span><br />
&nbsp;&nbsp;} catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp;// TODO Auto-generated catch block<br />
&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;is.close();<br />
&nbsp;&nbsp;&nbsp;throw new Exception("====读取规则的资源文件" + fileName + "出错，请检查文件"+ fileName + "=====", e);<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;String drl = null;<br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">drl = converter.compile(is, InputType.XLS);</span><br />
&nbsp;&nbsp;&nbsp;logger.debug("Drools Excel规则文件：" + fileName + "编译成.drl文件的结果："+ drl);<br />
&nbsp;&nbsp;} catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp;// TODO Auto-generated catch block<br />
&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;is.close();<br />
&nbsp;&nbsp;&nbsp;throw new Exception("xls文件编译成drl文件出错", e);<br />
&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;<span style="color: #0000ff">PackageBuilder builder = new PackageBuilder();<br />
&nbsp;&nbsp;StringReader srd = new StringReader(drl);<br />
&nbsp;&nbsp;builder.addPackageFromDrl(srd);<br />
&nbsp;&nbsp;pkg = builder.getPackage();<br />
&nbsp;&nbsp;pkgMap.put(fileName, pkg);<br />
</span>&nbsp;&nbsp;is.close();<br />
&nbsp;&nbsp;return pkg;<br />
&nbsp;}</p>
}
<img src ="http://www.blogjava.net/tfzhu/aggbug/315099.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tfzhu/" target="_blank">断点</a> 2010-03-10 22:29 <a href="http://www.blogjava.net/tfzhu/archive/2010/03/10/315099.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Drools 4.0</title><link>http://www.blogjava.net/tfzhu/archive/2010/03/10/315094.html</link><dc:creator>断点</dc:creator><author>断点</author><pubDate>Wed, 10 Mar 2010 13:43:00 GMT</pubDate><guid>http://www.blogjava.net/tfzhu/archive/2010/03/10/315094.html</guid><wfw:comment>http://www.blogjava.net/tfzhu/comments/315094.html</wfw:comment><comments>http://www.blogjava.net/tfzhu/archive/2010/03/10/315094.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tfzhu/comments/commentRss/315094.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tfzhu/services/trackbacks/315094.html</trackback:ping><description><![CDATA[<p><span style="color: #0000ff">1、Drools是什么?</span><br />
Drools 是一个基于Charles Forgy's的Rete算法的，专为Java语言所设计的规则引擎。Rete算法应用于面向对象的接口将使基于商业对象的商业规则的表达更为自然。Drools是用Java写的，但能同时运行在Java和.Net上。</p>
<p>一路到底的框架：<br />
大多数开发者都有自己喜爱的框架。无特定顺序，它们包括表现层框架（Struts, JSF, Cocoon和Spring）,持久化框架（JDO, Hibernate, Cayenne and Entity Beans）以及结构框架(EJB, 又是Spring, Pico和Excalibur), 还有其它很多。每种框架都各有所长，给开发者提供子许多&#8220;即开即用&#8221;的功能。使用框架来部署应用意味着你避免了许多让人厌烦的细节，让你集中注意力到关键之处。<br />
到目前为直，在框架所能做的事中仍然有一个缺口，那就是商业逻辑没有框架。像EJB和Spring这样的工具虽好，但它们却几乎没有提及怎么组织你的那些if &#8230;then语句。把Drools加到你的开发工具箱中意味着现在你可以&#8220;一路到底&#8221;的使用框架来构建你的应用程序。</p>
<p><br />
<span style="color: #0000ff">2.Drools4.0版本：</span><br />
JBoss Drools是一款开源的业务规则引擎，目前已经发布了4.0版本。在4.0版本中主要的特色和改进如下： <br />
1.更高的性能：较之于之前的版本，Drools 4.0更为高效并且占用更少的内存空间。内部的性能测试表明，性能的提升已经从几分钟缩减为若干秒钟。 <br />
2.提升的表达能力：当前的发布版引入了更为强大且的业务行为脚本语言（MVFlex表达式语言）。<br />
3.友好的业务分析工具：一个具备向导功能的规则编辑器的增加，使得非程序员用户可以设计复杂的业务规则，并在没有编写任何代码的情况下自动绑定企业数据。提供带有菜单提示和下拉列表的向导来帮助用户完成设计过程。 <br />
4.规则流的能力：可视化的建模技术可以使用户声明式地为相应规则的执行路径建立访问模型。它同样还允许在单个工作内存中存在多个并发工作流，并根据控制典型的业务处理过程的需求，从根本上组织规则的执行。 5.多应用支撑：对于有状态和无状态处理过程增强的支持以及全面的线程安全性，辅助Drools更轻易的嵌入在Java平台，JavaEE以及面向服务的商业应用之中。 <br />
6.直接可和Hibernate集成：用户可以直接在Hibernate驱动的RDBMS查询中对数据（facts）进行判断。现有的Hibernate组件可以直接用在规则引擎里，减少编码的工作量。 <br />
7.为非程序员设计的BRMS：从技术角度来看，新的BRMS基于Web开发，使用AJAX呈现，便于协作，是一个编写、版本化控制和管理规则的系统。业务分析师目前可以交互式的授权或修改自动转换的规则。管理员目前具备完全的生命周期控制能力，包含何种规则在QA阶段，分段（staging），以及实施（production）阶段等等。 <br />
<br />
<span style="color: #0000ff">3.Drools的总体架构：</span> <br />
我们使用Drools就是为了让它处理数据与规则的关系，因此Drools要获得数据和获得规则，然后进行执行。因此Drools分为编制和运行时两个部分。 <br />
编制是指产生rule的过程，Drools用DRL，或者XML来描述规则。编制的过程包括为规则建立DRL 或XML 文件，传入一个由Antlr 3 文法器定义的解析器中。解析器对文件中规则文法的正确性进行检查并为descr 建立一个中间结构，在AST 中的descr 代表规则的描述。AST 然后将descr 传入Package Builder中，由其进行打包。Package Builder 同时负责包括打包中用到的所有代码产生器和编译器。Package 对象是自包含并可配置的，它是一个包含规则的序列化的对象。 </p>
<p>RuleBase 是运行时组件，包含一个或多个Package。Package 在任何时候都可以向RuleBase中添加或删除。一个RuleBase 可以同时初始化多个Working Memory，在其间维护着一个弱引用，除非重新进行配置。Working Memory 包含许多子组件，如Working Memory Event Support(事件支持),Truth Maintenance System(真值维护系统), Agenda 和 Agenda Event Support(事件支持)。向Working Memory 中设置对象的工作可能要在建立了一个或多个激活的规则后才结束。Agenda 负有规划激活规则运行的责任。 <br />
<br />
<br />
<span style="color: #0000ff">4.Drools主要有以下类实现：</span> <br />
编制： <br />
XmlParser,DrlParser 分别用来解析XML描述的规则文件和DRL描述的规则文件。 <br />
PackageBuilder 创建package实例。 <br />
例如： <br />
PackageBuilder builder = new PackageBuilder(); <br />
builder.addPackageFromDrl( new InputStreamReader( getClass().getResourceAsStream( "package1.drl" ) ) ); <br />
builder.addPackageFromXml( new <br />
InputStreamReader( getClass().getResourceAsStream( "package2.xml" ) ) ); <br />
Package pkg = builder.getPackage(); </p>
<p>运行时的类： <br />
RuleBase 使用RuleBaseFactory 实例化，默认情况下返回一个ReteOO 的RuleBase。Package通过使用addPackage 方法按顺序加入。你可以指定任何名称空间的Packages 或者同一名称的多个包加入RuleBase。 <br />
RuleBase ruleBase = RuleBaseFactory.newRuleBase(); <br />
ruleBase.addPackage( pkg ); </p>
<p>事实数据相关类： <br />
WorkingMemory 保存运行时事实数据的地方。 <br />
由ruleBase产生：WorkingMemory wm= ruleBase.newStatefulSession(); </p>
<p>加载事实数据： <br />
wm.insert(object ); <br />
insert方法返回一个FactHandle对象指向workingMemory中对象的引用。如果要对Object进行修改删除等操作都要通过FactHander对象来完成。 </p>
<p>在准备好Rule，和Fact后 就可以调用 WorkingMemory对象的 fireAllRules（）方法执行规则引擎。 </p>
<p>Agenda上面提到过它负有规划激活规则运行的责任。 <br />
它运行过程分两个阶段： <br />
1） WorkingMemory Actions ： assert 新的 facts ，修改存在的 facts 和 retract facts 都是 WorkingMemory Actions 。通过在应用程序中调用 fireAllRules() 方法，会使引擎 转换到 Agenda Evaluatioin 阶段。 <br />
2） Agenda Evaluation ：尝试选择一条规则进行激发（ fire ）。如果规则没有找到就 退出，否则它就尝试激发这条规则，然后转换到 WorkingMemory Actions 阶段，直到 Agenda中为空。&nbsp;<br />
</p>
<img src ="http://www.blogjava.net/tfzhu/aggbug/315094.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tfzhu/" target="_blank">断点</a> 2010-03-10 21:43 <a href="http://www.blogjava.net/tfzhu/archive/2010/03/10/315094.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>