W mojej aplikacji Grails zainstalowałem wtyczkę Quartz. Chcę przechwytywać wywołania do każdej klasy kwarcowej klasy "execute
", aby coś zrobić zanim zostanie wywołana metoda (podobna do AOP przed poradą).Przejęcie metody Groovy
Obecnie staram się robić to przechwycenie z zamknięciem innej wtyczki doWithDynamicMethods
jak pokazano poniżej:
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)
}
}
}
}
więc, biorąc pod uwagę zadania, takie jak
class TestJob {
static triggers = {
simple repeatInterval: 5000l // execute job once in 5 seconds
}
def execute() {
"execute called"
}
}
Należy wydrukować:
to powinno się zdarzyć przed wykonaniem()
wykonać c alled
Ale moja próba przechwycenia metoda wydaje się mieć żadnego wpływu i zamiast po prostu drukuje:
execute nazywa
Być może przyczyną problemu jest this Groovy bug? Mimo że klasy zadań nie implementują jawnie interfejsu org.quartz.Job
, podejrzewam, że niejawnie (z powodu niektórych Groovy voodoo), są one instancjami tego interfejsu.
Jeśli rzeczywiście ten błąd jest przyczyną mojego problemu, czy istnieje inny sposób, który mogę zrobić "przed przechwyceniem metody"?
Myślałem, że jesteś świadomy podejścia AOP, ale chciał alternatywy dla niego. :) – dmahapatro