在 grails 作业中执行脚本
Executing scripts in a grails Job
我正在处理一个程序的两个部分。一个创建小型 groovy 脚本,另一个在作业中执行它们。每个脚本用于将信息从映射转换为域对象。然后作业将保存域对象以备将来使用。
这是一个小例子。
域
class Report {
Date date
Country country
}
地图
Map<String, String> map = new HashMap<String, String>();
map.put("date", "2015-04-21 11:31:11");
map.put("country", "United States");
日期脚本
String script = "x.date = Date.parse('y-M-d h:m:s', y['date'])"
脚本当前使用 Eval 执行。
Eval(report, map, script)
还有其他更复杂的脚本,需要查找信息并根据值做出决策。
日期脚本工作正常,但在执行国家/地区脚本时出现错误。
国家文字
String script = "import app.Country\nx.country = Country.findByName(y['country'])"
错误
Script1.groovy: 1: unable to resolve class app.Country
似乎国家 class 没有在调用 Eval 时加载。如何在 Eval 中进行导入?我应该使用 Eval 还是 GroovyShell?
您需要实例化一个 GroovyShell 作为参数传递给 grailsApplication class 加载器,请参见下面的示例:
Bootstrap.groovy
Map bindingValues = new HashMap()
bindingValues.sessionFactory = sessionFactory
bindingValues.propertyInstanceMap = propertyInstanceMap
bindingValues.dataSource = dataSource
bindingValues.ctx = grailsApplication.mainContext
GroovyShell gs = new GroovyShell(grailsApplication.classLoader, new Binding(bindingValues))
gs.evaluate new File("docs/CargaAvaliacoes.groovy")
CargaAvaliacoes.groovy
import avaliacao.Colaborador
import modelo.ModeloAvaliacao
import programa.Programa
def programa = Programa.get(1)
def modelo = ModeloAvaliacao.get(1)
def avaliadores = ["02270789332":"1020016","11388449681":"1010002","02231772331":"1010004","04247774332":"1020002"]
def avaliacaoService = ctx.getBean("avaliacaoService")
avaliadores.each {
def avaliador = Colaborador.findByCpf(it.key)
def avaliados = Colaborador.findAllBySetorAndCpfNotEqual(it.value,it.key)
avaliados.each {
avaliacaoService.cadastrar(programa, modelo, avaliador, it)
}
}
** 您需要指定 grailsApplication.classLoader 因为这个 class 加载程序用于加载 Grails 域 classes.
我正在处理一个程序的两个部分。一个创建小型 groovy 脚本,另一个在作业中执行它们。每个脚本用于将信息从映射转换为域对象。然后作业将保存域对象以备将来使用。
这是一个小例子。
域
class Report {
Date date
Country country
}
地图
Map<String, String> map = new HashMap<String, String>();
map.put("date", "2015-04-21 11:31:11");
map.put("country", "United States");
日期脚本
String script = "x.date = Date.parse('y-M-d h:m:s', y['date'])"
脚本当前使用 Eval 执行。
Eval(report, map, script)
还有其他更复杂的脚本,需要查找信息并根据值做出决策。
日期脚本工作正常,但在执行国家/地区脚本时出现错误。
国家文字
String script = "import app.Country\nx.country = Country.findByName(y['country'])"
错误
Script1.groovy: 1: unable to resolve class app.Country
似乎国家 class 没有在调用 Eval 时加载。如何在 Eval 中进行导入?我应该使用 Eval 还是 GroovyShell?
您需要实例化一个 GroovyShell 作为参数传递给 grailsApplication class 加载器,请参见下面的示例:
Bootstrap.groovy
Map bindingValues = new HashMap()
bindingValues.sessionFactory = sessionFactory
bindingValues.propertyInstanceMap = propertyInstanceMap
bindingValues.dataSource = dataSource
bindingValues.ctx = grailsApplication.mainContext
GroovyShell gs = new GroovyShell(grailsApplication.classLoader, new Binding(bindingValues))
gs.evaluate new File("docs/CargaAvaliacoes.groovy")
CargaAvaliacoes.groovy
import avaliacao.Colaborador
import modelo.ModeloAvaliacao
import programa.Programa
def programa = Programa.get(1)
def modelo = ModeloAvaliacao.get(1)
def avaliadores = ["02270789332":"1020016","11388449681":"1010002","02231772331":"1010004","04247774332":"1020002"]
def avaliacaoService = ctx.getBean("avaliacaoService")
avaliadores.each {
def avaliador = Colaborador.findByCpf(it.key)
def avaliados = Colaborador.findAllBySetorAndCpfNotEqual(it.value,it.key)
avaliados.each {
avaliacaoService.cadastrar(programa, modelo, avaliador, it)
}
}
** 您需要指定 grailsApplication.classLoader 因为这个 class 加载程序用于加载 Grails 域 classes.