本周一直在解决drools4.0.7规则引擎中的乱码问题。经过对drools4.0各个版本的测试(4.0.0 , 4.0.4 ,4.0.7),4.0.0:虽然能很好的用utf-8输出中文,但是由于其规则文件只能接受一个function,当大于一个function时就会导致stackoverflow的异常,所以不得不放弃。后来采用目前官网上最新的4.0版本 4.0.7,function方式已经解决。换了4.0.7版本后,本地测试(main)ok,但是尝试了多个eclipseJDTcore无法正常部署在jboss上运作,因而改用janino,可以正常运行。
ps: 使用janino的方法如下:
PackageBuilder是可以配置的,使用PackageBuilderConfiguration。通常,你可以指定另一个parent ClassLoader和用什么编译器(compiler),默认是Eclipse JDT。下面显示了如何指定JANINO编译器:
PackageBuilderConfiguration conf = new PackageBuilderConfiguration();
conf.setCompiler( PackageBuilderConfiguration.JANINO );
PackageBuilder builder = new PackageBuilder( conf );
开发环境统一采用了utf-8,然而此时运行规则后的结果中文部分全变成了乱码,经过调试drools的源代码,发现 drools的源代码中 org.drools.rule.builder.dialect.java.JavaDialect 类中 public void compileAll() 方法里 File dumpDir = this.configuration.getPackageBuilderConfiguration().getDumpDir(); 中得到的文件并非utf-8编码。在addClassCompileTask方法中是text是用getBytes方法(无参数)add进src的。因此,在addClassCompileTask 方法中,将src.add(fileName, text.getBytes())方法加入我们需要的utf-8参数,将其用utf-8编码,问题终于解决。(getBytes默认是platform’s default charset)
具体代码代码如下:
private void addClassCompileTask(final String className,
final BaseDescr descr, final String text,
final MemoryResourceReader src, final ErrorHandler handler)
{
final String fileName = className.replace('.', '/') + ".java";
try
{
src.add(fileName, text.getBytes((String) System
.getProperty("myproject.drools.encoding")));
// 在运行规则前可将 自定义"myproject.drools.encoding" 属性设为"utf-8"即可;
//System.setProperty("myproject.drools.encoding","utf-8");
} catch (UnsupportedEncodingException e)
{
throw new RuntimeException(e);
}
this.errorHandlers.put(fileName, handler);
addClassName(fileName);
}
oracle默认的输入编码为GBK,输出的编码为utf-8,因此从数据库中用utf-8的方式读入规则字符串,一切正常。


