某些场景下Java系统里需要动态执行一段配置在数据库中(也可以是其他存储)的逻辑,仅仅基于Java是无法完成的,但可以通过集成Groovy来实现这个效果,尝试过程如下:
1)在数据库中配置脚本,表结构随意定义,例子如下:
2)Java中动态调存在于数据库里的groovy脚本(存在上表中的script字段里)
File f = null;
BufferedWriter bw = null;
Connection con = null;
try {
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection("jdbc:mysql://10.20.168.42:3306/cutemock","root","111111");
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("SELECT script FROM mock where service='"+
serviceName+"' and method='"+methodName+"'");
if(rs.next()){
LOGGER.info("start run script:"+rs.getString("script"));
f = File.createTempFile("gse", ".groovy");
bw = new BufferedWriter(new FileWriter(f));
bw.write(rs.getString("script"));
bw.flush();
Binding binding = new Binding();
GroovyScriptEngine gse = new GroovyScriptEngine(f.getParentFile().getName());
Object result = gse.run(f.getName(), binding);
hsfResponse.setAppResponse(result);
return hsfResponse;
}
} catch (Exception e) {
LOGGER.error("run groovy error", e);
}finally{
try {
if(bw!=null){
bw.close();
}
if(f!=null){
f.delete();
}
if(con!=null){
con.close();
}
} catch (Exception e2) {
// TODO: handle exception
}
}
上面代码比较简单,关键在于两点:
1)通过GroovyScriptEngine来执行groovy脚本
2)从数据库里load出groovy代码,并放入临时文件里,使其成为一段可执行的.groovy文件