我正在开发一个为Drools 5.5运行促销引擎系统的项目。在构建知识库时,我在尝试理解编译步骤时遇到了一些麻烦。
情况就是这样:我有一个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 :(得分:0)
在5.0.0之后,DRL解析器已经进行了一系列改进,然后在(IIRC)5.2和5.3之间进行了彻底的重新设计。
为了理解在编译时和运行时5.5中的ArrayList(size >= something)
会发生什么,人们必须知道“某事”是什么。完全讨论代替“某事”的一切都超出了范围,但是,根据经验,如果表达式是有效的Java,它应该编译而不是在运行时发牢骚,隆隆声或翻滚 - 更不用说“爆炸”了(让我们希望它不会破坏核心。)
<强>后来强>
原因是(在开发线的某处)已经进行了区分,而不是对集合应用“类型安全”,而默认情况下所有其他类都是“类型安全”,这意味着编译时检查。
您可以使用例如ArrayList
将其添加到您的DRL文件中来启用此功能:
declare ArrayList
@typesafe( true )
end