Java应用程序需要很长时间才能执行预先完成的Groovy脚本

时间:2019-02-19 20:25:27

标签: groovy

我在服务器启动时预先完成了Groovy脚本(我已经将Groovy脚本存储为DB中的varchar),如下图所示,

final Binding sharedData = new Binding();
final GroovyShell shell = new GroovyShell(sharedData);
script= shell.parse(rs.getString("VALIDATION_SCRIPT"));

现在,当基于指定的验证ID检查输入记录的验证时,我尝试执行如下所示的预编译脚本。

Script scrpt = Validation.getScript(); //getting from cache
scrpt.getBinding().setVariable("attributes", objects);
scrpt.getBinding().setVariable("tools", scrpt);
GroovyResponse gr = scrpt.evaluate("tools.valid(attributes)");

但是这里我的应用程序需要花费很长时间进行评估..我想堆大小也会增加,并且会发生GC。如果有更好的方法可以帮助我。不会影响性能。

我的常规脚本之一:

import com.fis.derivatives.utility.generic.model.GroovyResponse;

def valid(Map mapInput){
    GroovyResponse obj = new GroovyResponse()
    if(mapInput.inputVal.equals("1")){
        obj.setStatus(true) ;
        obj.setResultValue("B") ;
    } else if(mapInput.inputVal.equals("2")){
        obj.setStatus(true) ;
        obj.setResultValue("S") ;
    }else{
        obj.setStatus(false);
        obj.setComment("Error : Unable to extract BUY_SELL. Please check BS value "+mapInput.inputVal+".")
    }
    return obj;
}

1 个答案:

答案 0 :(得分:0)

1-我对您的缓存有疑问。从缓存中获取任何密钥都是很奇怪的...

Script scrpt = Validation.getScript(); //getting from cache

2-重做一些时髦的事情:

Script scrpt = Validation.getScript(); //getting from cache
//we will pass attributes as a parameter to method
//scrpt.getBinding().setVariable("attributes", objects); 
//not necessary to pass to script link to itself 
//scrpt.getBinding().setVariable("tools", scrpt);

GroovyResponse gr = scrpt.invokeMethod​("valid", objects);