2014-06-09 42 views
0

我正在开发一个为促销引擎系统运行Drools 5.5的项目。我在构建知识库时尝试了解编译步骤时遇到了一些麻烦。这个drl应该编译吗?

这是这种情况:我有一个drl在条件大小> = int的列表上执行收集(LHS)。 生成drl的系统,做错了,现在我有运行时异常。现在,我正试图理解这种情况下编译如何在drools上运行。

的事情是,在此收集,约束(大小> =的事情,这东西不是整数)不被Drools的5.5编译器验证,异常只会在运行时发生爆炸:

$COLLECT_ALL : ArrayList (size >= something) 
    from collect (Product (...)) 

但是,在drools 5.0.0上验证了相同的代码,并且我可以在创建知识库之前删除此规则。

我不知道这是一个错误还是只是错误理解LHS上的流口水。

无论如何,这是我的工作

KnowledgeBuilder builder = KnowledgeBuilderFactory.newKnowledgeBuilder(); 
builder.add(ResourceFactory.newByteArrayResource(rule.getBytes()) , ResourceType.DRL); 
if (builder.hasErrors()) { 
    createErrorMessage(builder); 
} 

回答

0

验证步骤的DRL解析器undergon 5.0.0经过长期的一系列的改进,然后之间存在着一个完整的重新设计(IIRC )5.2和5.3。

为了理解编译时和运行时在5.5中的ArrayList(size >= something)会发生什么,我们必须知道“东西”是什么。对一切代替“某事”的完整讨论超出了范围,但是,作为一个经验法则,如果表达式是有效的Java,它应该在运行时进行编译而不是发牢骚,隆隆或颠簸 - 更不用说“爆炸”了(让我们希望它不会损坏核心)。

后来

的原因是(沿线发展的某处)区分已经作出,而不是而所有其他类“类型安全”应用“类型安全”到集合默认情况下,该意味着编译时检查。

您可以通过添加这对您的DRL文件上使用打开此,例如,对于ArrayList

declare ArrayList 
@typesafe(true) 
end 
+0

从技术上讲,它不是一个有效的Java语句。 “某事”确实是某种东西。我知道这听起来很奇怪,但它只是文件中的一个词。看起来像一个变量,但从未宣布。例如:当COLLECT_ALL:ArrayList(size> = tag-xyz) from collect(Product(...))时,规则“XYZ”然后...' – VitorBtf

+0

感谢您的澄清。 - 看起来和w.r.t有区别错误报告。 'Product'中的类似错误在编译时被标记。我在Drools用户名单上追求这一点。 – laune

+0

请参阅我的答案的补充内容。 – laune