我想从Java调用Groovy脚本并定期刷新Groovy脚本。 例如,
public class AppTest {
public static void main(String args[]) throws Exception {
TestVO test = new TestVO();
AnotherInput input = new AnotherInput();
test.setName("Maruthi");
input.setCity("Newark");
GroovyClassLoader loader = new GroovyClassLoader(AppTest.class.getClassLoader());
Class groovyClass = loader.parseClass(new File("src/main/resources/groovy/MyTestGroovy.groovy"));
GroovyObject groovyObject = (GroovyObject) groovyClass.newInstance();
Object[] inputs = {test,null};
Map<String,String> result = (Map<String, String>)groovyObject.invokeMethod("checkInput", inputs);
System.out.println(result);
}
}
我的Groovy脚本是
class MyTestGroovy {
def x = "Maruthi";
def checkInput = { TestVO input,AnotherInput city ->
if(input.getName().equals(x)) {
input.setName("Deepan");
println "Name changed Please check the name";
} else {
println "Still Maruthi Rocks";
}
Map<String, String> result = new HashMap<String,String>();
result.put("Status", "Success");
if(city != null && city.getCity().equalsIgnoreCase("Newark")) {
result.put("requested_State", "Newark");
}
return result;
}
def executeTest = {
println("Test Executed");
}
}
当我创建多个groovy脚本实例并执行脚本时,我的内存管理效率如何。是否建议使用许多Groovy脚本作为我的自定义规则引擎。请指教。
答案 0 :(得分:0)
与每次要创建实例时解析类相比,拥有相同脚本的多个实例通常更好。性能方面,因为编译脚本需要一些时间,除了创建实例之外,还必须付费。在内存方面,您可以更快地消耗可用类的数量。即使收集旧类,如果你有许多活动的脚本,它也可能发生......虽然这通常意味着数百甚至数千个(取决于jvm版本和你的内存设置)
当然,一旦脚本发生变化,您无论如何都必须重新编译该类。因此,如果在您的场景中,您只有一个类的实例同时处于活动状态,并且只有在更改源之后才需要新实例,则可以每次重新编译。
我特别提到这一点,因为您甚至可以以某种方式编写脚本,这样您就可以重用相同的实例。但它当然超出了这个问题的范围。