在我的 Grails 应用程序中,我安装了 Quartz 插件。我想拦截对每个 Quartz 作业类的execute
方法的调用,以便在调用该方法之前做一些事情execute
(类似于 AOP 之前的通知)。
目前,我正在尝试从doWithDynamicMethods
另一个插件的关闭中进行拦截,如下所示:
def doWithDynamicMethods = { ctx ->
// get all the job classes
application.getArtefacts("Job").each { klass ->
MetaClass jobMetaClass = klass.clazz.metaClass
// intercept the methods of the job classes
jobMetaClass.invokeMethod = { String name, Object args ->
// do something before invoking the called method
if (name == "execute") {
println "this should happen before execute()"
}
// now call the method that was originally invoked
def validMethod = jobMetaClass.getMetaMethod(name, args)
if (validMethod != null) {
validMethod.invoke(delegate, args)
} else {
jobMetaClass.invokeMissingMethod(delegate, name, args)
}
}
}
}
所以,给定一份工作,比如
class TestJob {
static triggers = {
simple repeatInterval: 5000l // execute job once in 5 seconds
}
def execute() {
"execute called"
}
}
它应该打印:
这应该在调用 execute() 之前
发生
但我在方法拦截的尝试似乎没有任何效果,而是它只是打印:
执行调用
也许问题的原因是这个 Groovy 错误?即使 Job 类没有显式地实现org.quartz.Job
接口,我怀疑隐含地(由于一些 Groovy 巫术),它们是这个接口的实例。
如果确实这个错误是我的问题的原因,是否有另一种方法可以“在方法拦截之前”进行?