In meiner Grails App habe ich das Quartz Plugin installiert. Ich möchte Aufrufe an jede Quarz-Jobklasse ' execute
' abfangen, um etwas zu tun, bevor die execute
-Methode aufgerufen wird (ähnlich wie AOP vor dem Advice).
Momentan versuche ich dieses Interception von der doWithDynamicMethods
Schließung eines anderen Plugins zu machen, wie unten gezeigt:
Also, bei einem Job wie
%Vor%Es sollte gedruckt werden:
Dies sollte vor dem Ausführen () geschehen Ausführen mit
aufgerufen
Aber mein Versuch, Methoden abzufangen, scheint keine Wirkung zu haben und stattdessen druckt er nur:
Ausführen aufgerufen
Vielleicht ist die Ursache des Problems dieser Groovy-Bug ? Obwohl die Job-Klassen die org.quartz.Job
-Schnittstelle nicht explizit implementieren, vermute ich, dass sie implizit (aufgrund einiger Groovy-Voodoos) Instanzen dieser Schnittstelle sind.
Wenn dieser Bug tatsächlich die Ursache meines Problems ist, gibt es einen anderen Weg, den ich "vor dem Abfangen von Methoden" machen kann?
Da alle Job-Klassen Spring-Beans sind, können Sie dieses Problem mit Spring AOP lösen. Definieren Sie einen Aspekt wie den folgenden (passen Sie die Pointcut-Definition so an, dass sie nur Ihren Job-Klassen entspricht, ich nehme an, dass sie alle in einem Paket namens org.example.job
sind und einen Klassennamen haben, der mit Job
endet).
Sie müssen diesen Aspekt als Spring Bean registrieren (es spielt keine Rolle, welchen Namen Sie der Bean geben).
Sie können Ihre benutzerdefinierte JobListener
in der Anwendung registrieren lassen, um Logiken zu verarbeiten, bevor execute()
ausgelöst wird. Sie können etwas wie: -
Registrieren Sie den angepassten Job Listener in Quartz Scheduler
in Bootstrap: -
resources.groovy: -
%Vor%Sie bekommen die Job-Klassen nicht so. Wenn Sie auf das Quartz-Plugin verweisen, können Sie sie abrufen, indem Sie jobClasses aufrufen:
%Vor%siehe Ссылка
Wenn Sie tatsächlich schauen, können Sie sehen, dass sie fast das tun, was Sie versuchen, ohne die Notwendigkeit, aop oder etwas anderes zu verwenden.
Für das Abfangen von Methoden implementieren Sie invokeMethod für die Metaklasse. In meinem Fall war die Klasse nicht von dritter Seite, so dass ich die Implementierung ändern kann.
>Tags und Links grails groovy metaprogramming