Groovy Methodenüberwachung

8

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:

%Vor%

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?

    
Abasourdi 28.05.2013, 08:13
quelle

4 Antworten

4

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).

%Vor%

Sie müssen diesen Aspekt als Spring Bean registrieren (es spielt keine Rolle, welchen Namen Sie der Bean geben).

    
Dónal 30.05.2013, 20:25
quelle
2

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: -

verwenden %Vor%

Registrieren Sie den angepassten Job Listener in Quartz Scheduler in Bootstrap: -

%Vor%

resources.groovy: -

%Vor%
  • Ein Vorteil, den ich bei diesem Ansatz sehe, ist, dass wir das zweite Plugin, das für das Abfangen von Methoden verwendet wird, nicht mehr benötigen.
  • Zweitens können wir den Listener registrieren, um alle Jobs, bestimmte Jobs und Jobs in einer Gruppe zu hören. Siehe Quartz JobListener anpassen und API für JobListener , TriggerListener , ScheduleListener für mehr Einsicht.
  • Offensichtlich ist AOP ein anderer Ansatz, wenn wir die Quartz-API verwenden möchten.
dmahapatro 30.05.2013 20:33
quelle
2

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.

    
moskiteau 30.05.2013 19:46
quelle
1

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.

Folgen Sie diesem Blog für weitere Informationen.

>     
Umair Saleem 30.05.2013 18:26
quelle

Tags und Links