从Java调用Groovy脚本并定期刷新Groovy脚本

时间:2014-07-06 06:04:30

标签: java grails groovy

我想从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脚本作为我的自定义规则引擎。请指教。

1 个答案:

答案 0 :(得分:0)

与每次要创建实例时解析类相比,拥有相同脚本的多个实例通常更好。性能方面,因为编译脚本需要一些时间,除了创建实例之外,还必须付费。在内存方面,您可以更快地消耗可用类的数量。即使收集旧类,如果你有许多活动的脚本,它也可能发生......虽然这通常意味着数百甚至数千个(取决于jvm版本和你的内存设置)

当然,一旦脚本发生变化,您无论如何都必须重新编译该类。因此,如果在您的场景中,您只有一个类的实例同时处于活动状态,并且只有在更改源之后才需要新实例,则可以每次重新编译。

我特别提到这一点,因为您甚至可以以某种方式编写脚本,这样您就可以重用相同的实例。但它当然超出了这个问题的范围。