KieBase对象损坏了吗?

时间:2016-12-20 15:47:40

标签: drools

由于性能考虑,我们尝试重新使用相同的KieBase对象为针对同一规则集的每个规则调用生成新的KieSession。 Everthingyth运行良好,直到一段时间突然之后,来自缓存的kieBase的新创建的kieSession停止触发它应该的规则。

但是一旦我们摆脱了缓存的kieBase并重新创建了一个新的kieBase并使用它创建了一个kieSession,它就会重新开始工作。

我们的理解是kieBase对象不保存特定于会话的数据。但是这种行为似乎表明缓存的kieBase会随着时间的推移而受到篡改。

我们使用的版本是6.3.0.Final。

对此的任何提示都将受到高度赞赏。

1 个答案:

答案 0 :(得分:0)

我也有这个问题。在快速连续创建20个会话之后,第21个会话将在此规则中向BigDecimal投射ClassCastException,即使在前20个会话中运行时没有:

rule IsMaterialChange_TotalMonthlyIncomeAmountUpdate when
    Data("TOT_MO_INCM_AMT-ORIGINAL_VALUE"; $originalTotalMonthlyIncomeAmount : value)
    Data("TOTALMONTHLYINCOMEAMOUNT"; (BigDecimal) value != (BigDecimal) $originalTotalMonthlyIncomeAmount)
then
    insert(new IsMaterialChange("TotalMonthlyIncomeAmountUpdate", true));
end

在挖掘了一下后,我发现this answer指向JIT编译器作为原因。它的默认阈值为20,与我的问题完全一致。由于某种原因,JIT编译器在转换此值时遇到问题。

我像这样禁用了JIT编译器:

KieContainer kieContainer = kieServices.newKieContainer(kieServices.getRepository().getDefaultReleaseId());
KieBaseConfiguration kieBaseConfiguration = kieServices.newKieBaseConfiguration();

// Disable JIT Compiler to prevent ClassCastException BigDecimal
kieBaseConfiguration.setOption(ConstraintJittingThresholdOption.get(-1));
KieBase kieBase = kieContainer.newKieBase(loaderKey, kieBaseConfiguration);