由于性能考虑,我们尝试重新使用相同的KieBase对象为针对同一规则集的每个规则调用生成新的KieSession。 Everthingyth运行良好,直到一段时间突然之后,来自缓存的kieBase的新创建的kieSession停止触发它应该的规则。
但是一旦我们摆脱了缓存的kieBase并重新创建了一个新的kieBase并使用它创建了一个kieSession,它就会重新开始工作。
我们的理解是kieBase对象不保存特定于会话的数据。但是这种行为似乎表明缓存的kieBase会随着时间的推移而受到篡改。
我们使用的版本是6.3.0.Final。
对此的任何提示都将受到高度赞赏。
答案 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);