0

我正在开发一个为推广引擎系统运行 Drools 5.5 的项目。我在构建知识库时试图理解编译步骤时遇到了一些麻烦。

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

问题是,在这个集合中,约束(size >= something ,其中 something 不是整数)没有被 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);
 }
4

1 回答 1

0

DRL 解析器在 5.0.0 之后经历了一系列改进,然后在 (IIRC) 5.2 和 5.3 之间进行了彻底的重新设计。

为了理解ArrayList(size >= something)5.5 在编译时和运行时发生了什么,必须知道“某事”是什么。代替“某事”对所有内容的完整讨论超出了范围,但是,根据经验,如果表达式是有效的 Java,它应该编译而不是在运行时发出抱怨、隆隆声或翻滚——更不用说“爆炸”(希望它不会损坏核心)。

之后

原因是(在开发过程中的某个地方)进行了区分,不将“类型安全”应用于集合,而所有其他类默认情况下都是“类型安全的”,这意味着编译时检查。

你可以打开它,例如,ArrayList通过将它添加到你的 DRL 文件中:

declare ArrayList
@typesafe( true )
end
于 2014-06-10T03:35:04.967 回答