具有多个线程的下垂链接错误



我有一个junit测试用例,它创建了两个线程来运行应用程序。在这个应用程序中,有一个方法updateStatus,用于fire drowls规则。在这个规则文件中,我有一些功能,比如下一个:

function Object updateItem() {
    .....
}
function boolean isNullOrEmpty(Object obj) {
   ...
}
function Object getValueFromFact(Object obj) {
   ....
}

我重新启动我的tomcat,运行这个单元测试,但有一个线程失败了,错误是:

org.apache.cxf.interceptor.Fault: loader (instance of org/drools/rule/JavaDialectRuntimeData$PackageClassLoader): attempted duplicate class definition for name: "com/icil/sofs/booking/rules/GetValueFromFact"

"getValueFromFact"是在规则文件中定义的函数。

然后在不重新启动tomcat的情况下再次运行它,没有错误。然后在不重新启动tomcat的情况下运行第三次,也没有错误。

经过尝试,我发现"重复类"错误只发生在重新启动tomcat后运行的第一次。

我还发现,在第一次,两个线程"同时"执行'knowldegeSession.execute',但两个线程在第二次和第三次依次运行'knowledgeSession.excute'。

那么,为什么这个错误"重复类定义"总是在tomcat重新启动后第一次运行时发生呢?

为什么错误是函数"getValueFromFact"(这是规则文件中的第三个函数),而不是第一个函数"updateItem"(它是规则文件的第一个函数)?

提前感谢!

因为有多个线程正在运行"execute()",并且它们正在"同时"加载函数,所以抛出了此错误。

当调用"addKnowledgePackages()"时,droolls将加载规则,但此时可能不会加载函数,它们可能在调用"execute()"的时候加载。

调试后,我发现如果规则条件在调用"addKnowlegePackages()"时使用mvel表达式而不是java表达式,则drools将加载函数。

我使用的是流口水5.5.0。最后,我目前无法将流口水升级到6.0,因为6.0有很大的差异。但我必须找到一个解决方案,因为这个问题需要尽快解决:

使您的代码"addKnowledgePackages()"可以在tomcat启动时运行,例如将其放在静态块中,以及更改规则以使用mvel表达式而不是java表达式。

最新更新