我正在使用 Guvnor (JBoss BRMS) 来管理部署在 JBoss EAP 5.3 中的 drools 规则引擎。我已将 Guvnor 更改为使用 Oracle 11g 实例作为它的 RDBMS。我使用 Guvnor 生成了一个新的 repository.xml 并将其放入 JBoss 目录的“bin”文件夹中。Guvnor 和 Drools 运行良好,似乎很高兴连接到 Oracle 11g 实例。
然后我继续创建一个包并添加一个新规则。我添加的规则如下:
dialect "mvel"
rule "TimeToClearRule"
when
#conditions
then
#actions
end
我验证了这个规则,然后重建了包。一切正常!
但是,我随后在规则上方添加了一个函数,目的是在规则中使用它。规则更改为以下内容:
dialect "mvel"
function double logNormalPdf(double mu, double sigma, double timeT) {
return 0.0;
}
rule "TimeToClearRule"
when
#conditions
then
#actions
end
我验证了这个规则并重建了包。但是,随后抛出了一个错误。它无法“保存项目”。在我的 JBoss 日志中,显示了以下错误(注意:不是完整的堆栈跟踪,仅添加了我认为是根本原因的内容)
17:59:51,815 ERROR [BundleWriter] Error while storing blob. id=9d26c61c-4dde-4009-a518-1f226431aa80/{http://www.jboss.org/drools-repository/1.0}compiledPackage idx=0 size=4353
java.lang.IllegalStateException: Unable to insert index for string: compiledPackage
at org.apache.jackrabbit.core.persistence.pool.NGKDbNameIndex.insertString(NGKDbNameIndex.java:66)
at org.apache.jackrabbit.core.persistence.pool.DbNameIndex.stringToIndex(DbNameIndex.java:95)
at org.apache.jackrabbit.core.persistence.pool.BundleDbPersistenceManager$DbBlobStore.createId(BundleDbPersistenceManager.java:1334)
Caused by: java.sql.SQLIntegrityConstraintViolationException: ORA-01400: cannot insert NULL into ("DROOLS"."PM_WS_DEFAULT_NAMES"."ID")
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:445)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396)
at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:879)
当 Drools/Guvnor 使用默认 DBMS 解决方案时,规则验证并构建良好。自从将 DBMS 移至 Oracle 11g 后,无法再验证规则并构建包。
我不知道为什么会这样。提供的任何帮助将不胜感激。
谢谢
更新是的,我发现我认为是问题所在。我在上面的示例中遗漏了一些东西,我发现这是导致错误的原因。我正在使用“数学”函数(java.lang.Math),这似乎导致了上面显示的错误。我正在创建的规则如下:
import java.lang.Math
dialect "mvel"
function double logNormalPdf(double mu, double sigma, double timeT) {
return Math.log(2);
}
rule "TimeToClearRule"
when
#conditions
then
#actions
end
drools/guvnor 可以处理数学函数吗?如果没有,我该如何使用它?
谢谢