2

我继承了一个程序,该程序使用 drools api 针对定义的 drl 规则文件运行 SettlementMessage 对象。该程序在生产中持续运行了大约 8 年。我们现在被要求从 Solaris SunOS 迁移到 IBM AIX 机器,并开始看到一些不一致的结果,几乎没有将金额字段与值进行比较的规则。

public class SettlementMessage implements Serializable {

    private double Amount=0;

    public double getAmount() {
        return Amount;
    }

    public void setAmount(double amount) {
        Amount = amount;
    }
.....

}

产生不一致结果的规则定义如下:

rule "Settlement Rule 1.1 - Large Settlement Amount For JPY and HUF - External Group"

    when
        $message: SettlementMessage(amount > 100000000.00, currencyCode in ("JPY","HUF"), settlementMethod in ("DIRECT_DEBIT","SWIFT", "SWIFT_EREL"))
    then 
        $message.setBusinessException("Exceeds Threshold - Confirm Settlement.");   
end


rule "Settlement Rule 1.2 - Large Settlement Amount For Others - External Group"

    when
        $message: SettlementMessage(amount > 3000000.00, currencyCode not in ("JPY","HUF"), settlementMethod in ("DIRECT_DEBIT","SWIFT", "SWIFT_EREL"))
    then 
        $message.setBusinessException("Exceeds Threshold - Confirm Settlement.");
end

还有许多其他规则将 SettlementMessage 对象的不同属性与某些值匹配,并且所有规则都按预期工作。我们只看到这些规则与数量远低于定义阈值的对象匹配的问题。

SettlementMessage我们每天都通过这些规则处理大量对象。通常当系统日期提前时 - 我们会处理 500 到 1500 个SettlementMessage对象。对象按顺序处理,而不是并行处理。在大多数情况下,大多数对象都会得到正确处理 - 如果数量低于指定阈值,则规则不匹配。如果金额高于指定阈值,则匹配规则。在某些日子里,某些对​​象会错误地与这些规则匹配(数量低于规则中定义的阈值)。SettlementMessage我们看到金额在 1 到 3000000 之间的对象的示例与规则之一匹配(取决于货币价值)。创建和运行规则的 Java 程序KieSession打包为 jar 文件,并从 Tibco Business Works 适配器调用。KieSession对象被创建为并在每个对象PooledObject的多次调用之间重用。只要 BW 适配器运行,对象就会存在。对象被插入,被调用,对象被删除。SettlementMessageKieSessionPooledObjectSettlementMessagefireAllRulesSettlementMessage

一些有趣的观察:当我们得到与这些规则不正确匹配的对象时,如果我再次重新发送相同的(克隆)SettlementMessage对象,它将再次不正确地匹配此规则。如果我重新启动 BW 适配器并再次重新发送相同的对象,那么它会正确处理。就像KieSession基础决策表在内存中以某种方式损坏,但重新启动后一切恢复正常。原始应用程序使用 Drools 5.0.1 API,我将其重写为使用 Drools 7.12.0,这对行为没有影响。

有谁知道为什么这个数量比较会在某些随机日期在某些对象上不匹配?有没有办法修改这条规则来完成相同的预期逻辑,但结果一致(没有不匹配)?我尝试稍微更改这些规则的语法,但没有解决我的问题。最大的问题是 - 对于我想尝试的每一个更改,我都无法在我的 DEV 机器上重现这个问题,我需要在 IBM AIX 机器上等待几天才能让它再次出现。

SunOS 机器运行的是 Oracle Java。

IBM AIX 机器正在运行 Java IBM J9 VM 2.9。

我将不胜感激有关如何修改此规则的任何见解,这可能会对我面临的问题产生一些影响。

4

0 回答 0