私の Grails アプリでは、Quartz プラグインをインストールしました。execute
メソッドが呼び出される前に何かを行うために、すべての Quartz ジョブクラスのメソッドへの呼び出しをインターセプトしたい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()
execute が呼び出される前に発生する必要があります
しかし、メソッドインターセプトの試みは効果がないようで、代わりに次のように出力されます。
呼び出された実行
おそらく問題の原因は、この Groovy のバグでしょうか? Job クラスはインターフェイスを明示的に実装していませんがorg.quartz.Job
、暗黙のうちに (Groovy ブードゥー教のために)、このインターフェイスのインスタンスであると思われます。
実際にこのバグが私の問題の原因である場合、「メソッドインターセプトの前」に実行できる別の方法はありますか?