我正在使用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以来,该规则无法再进行验证并构建了包。
我不知道为什么会这样。我们非常感谢您提供的任何帮助。
由于
更新是的,我发现了我认为的问题。我在上面的例子中遗漏了一些我发现错误的原因。我正在使用'Math'函数(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可以处理数学函数吗?如果没有,我该如何使用它?
由于
答案 0 :(得分:0)
您的数据库配置似乎存在问题,guvnor / jackrabbit可能无法在oracle存储库中创建所有必需的表。尝试与新的oracle架构进行新的数据库连接。