我有以下Drools规则文件,我向其发送填充了Custom对象(NodeElement)的地图,map是一个全局变量,因为它必须被所有规则访问,有另一个全局变量错误,当规则失败时填充。我已经使用了eval并且能够成功执行它。经过一些研究,发现eval有一些性能问题?
我的问题是......
1)性能问题可以忽略不计吗?
2)使用eval是一种很好的做法吗?
3)如果我必须重写这些规则?这是最好的方法吗?
import java.util.Map;
import com.infodev.pojo.NodeElement;
import com.main.Errors;
import com.validation.DateValidation;
global java.util.Map map;
global com.main.Errors errors;
rule "Fixed / Floating ccy rule"
when
eval(!((NodeElement)map.get("FixedCurrency")).getValue().equals(((NodeElement)map.get("FloatingCurrency")).getValue()))
then
errors.addError( "Currency", "Fixed currency should be same as Floating currency" );
end
rule "Payment / Settlement date rule"
when
eval(!(DateValidation.paymentDateValidation(((NodeElement)map.get("tradeDate")).getValue(),((NodeElement)map.get("paymentDate")).getValue())))
then
errors.addError(map.get("paymentDate").toString(), "Payment date should be after trade date" );
end
地图是:
Map<String, NodeElement> map = new HashMap<String, NodeElement>();
map.put("FixedCurrency", new NodeElement("FixedCurrency", "USD"));
map.put("FloatingCurrency", new NodeElement("FloatingCurrency", "UD"));
map.put("tradeDate", new NodeElement("tradeDate", "2012-01-22"));
map.put("paymentDate",new NodeElement("paymentDate", "2012-01-2"));
答案 0 :(得分:1)
鉴于NodeElement可以使用您用作Map的键的相同String来识别,为什么不直接将NodeElements插入到会话中?通过这样做,您可以像这样重写规则:
rule "Fixed / Floating ccy rule"
when
$n1: NodeElement( id == "FixedCurrency")
$n2: NodeElement( id == "FloatingCurrency", value != $n1.value)
then
errors.addError( "Currency", "Fixed currency should be same as Floating currency" );
end
rule "Payment / Settlement date rule"
when
$n1: NodeElement( id == "tradeDate")
$n2: NodeElement( id == "paymentDate", value != $n1.value)
eval(!(DateValidation.paymentDateValidation($n1.value, $n2.value)))
then
errors.addError($n2.value.toString(), "Payment date should be after trade date" );
end
我不能告诉你是否通过重写这样的规则会增加你的表现。这也取决于其他事情。你认为通过这种新方法获得的一件事是可读性。
希望它有所帮助,
答案 1 :(得分:-1)
您没有规则,您有if语句(伪装成规则)处理Map对象和其他静态对象中的值。 (为什么不在添加到地图后运行这些检查?)
我的规则中没有eval
。
如果您需要eval
,则必须使用eval
,如果可以避免,请避免使用。