JBoss AOP im Container

JBoss-AS-Unterstützung

Sollten Sie den JBoss AS nutzen, ist dieser spezielle AOP-Compiler bereits im Container enthalten. Sie müssen ihn nur aktivieren. Wechseln Sie in ihr Deployment-Verzeichnis und öffnen Sie die Datei: jboss-aop*.deployer/META-INF/jboss-service.xml. Dort finden Sie: <attribute name=“EnableLoadtimeWeaving“>true</attribute>.

Wobei dieser Parameter auf den Wert true gesetzt werden muß. Dies ermöglicht es dem Container, beim Deployment automatisch die Instrumentierung des Bytecodes vorzunehmen, das war’s. Im Prinzip gilt es nun nur noch, das AOP File zu erstellen. Wie üblich handelt es sich hierbei um ein Zip-File, allerdings mit der neuartigen Endung .aop. Anhand dieser erkennt der JBoss Deployment Scanner, dass es sich bei dieser Datei um ein AOP-Archiv handelt.

Dieses Archiv hat folgende Struktur, hier mit der Annotation Trace und der Aspektklasse TraceInterceptor, auf die wir noch kommen. Im META-INF-Verzeichnis liegt noch die Definition der Pointcuts, im jboss-aop.xml.

project
+---de
¦ +---aracom
¦ +---aop
¦ +---Trace.class
¦ +---TraceInterceptor.class
+---META-INF
+---jboss-aop.xml
+---MANIFEST.MF 

Wie funktioniert nun das Ganze? Wie bereits erwähnt, handelt es sich bei der Datei Trace.class um die Definition einer Annotation:

@Target({ElementType.METHOD})
public @interface Trace {
}

Wir deklarieren hier außerdem, dass diese Annotation nur für Methoden gültig sein soll – denn etwas anderes möchten wir nicht in unser Logfile schreiben. Ziel ist es also, jede Methode, die mit der Annotation Trace versehen wurde, mit einer Zeitmessung zu versehen. Sehen wir uns eine solche Methode beispielhaft an:

public MyClass {
     @Trace
     public void myMethod() {
     // do something
     }
     public void nichtTracen() {
     // do something else
     }
} 

Sobald diese Klasse aufgerufen wird, soll myMethod() einer Zeitmessung unterliegen, die andere Methode soll ungeschoren davonkommen. Definieren wir also die Regeln für unseren Methoden-Joinpoint. Dies geschieht in der Datei shopspeed-aop.xml und sieht wie folgt aus:

Im Prinzip gilt es hier, die etwas gewöhnungsbedürftige Syntax zu erlernen. Mit unseren neu gelernten Begriffen können wir diese Datei aber bereits ganz gut interpretieren. Der Tag „bind“ bindet einen Pointcut, also das Erkennungsmuster, an die Joinpoints (wie gesagt, prinzipiell gibt es Joinpoints überall – nur das Muster zählt); In unserem Falle, wenn irgendeine Methode (* *) mit der Annotation Trace (@de.aracom.aop.Trace) ausgeführt wird (execution). Die Regelnotation ist etwas ungewohnt, aber trotzdem relativ leicht zu erlernen.

Wenn dieses Muster zutrifft, kommt der Advice zu tragen: das ist – in OOP-Worten – die Methode des Aspekts. Das Attribut name beinhaltet demnach den Namen der auszuführenden Methode, in unserem Fall trace. Diese Methode ist in der Klasse zu finden, die im Attribut aspect definiert wird. Zeit, diese Klasse einmal näher zu betrachten:

public class TraceInterceptor {
     private static final Logger log =
     Logger.getLogger(TraceInterceptor.class);
     public Object trace(MethodInvocation invocation) throws Throwable {
     // Zeitmessung: START
     Zeitmesser.starteZeitmessung();
     invocation.invokeNext();
     // Zeitmessung: END
     Zeitmesser.beendeZeitmessung();
     return null;
     }
} 

Hier können wir ganz deutlich das Proxy-Design-Pattern und die Macht der Java Reflections API erkennen: Die Methode bekommt als Argument MethodeInvocation übergeben – also ein Objekt, welches den eigentlichen Methodenaufruf repräsentiert. Wir können nun gemütlich irgendwelche Dinge vor und nach dem Aufruf, dessen eigentliche Ausführung wir selbst bestimmen können, erledigen. Und das, ohne genaue Kenntnis von der Art der Methode zu haben. Wenn Sie nun Ihre Klassen mit dem AOP-Projekt deployen, erledigt der JBoss den Rest für Sie – in konkreten Worten, während des Deployments verwebt der Application-Server Ihren Bytecode mit den gewünschten Aspekten.

Christian Grobmeier ist Softwareentwickler für Java/JEE und EAI. In seiner Freizeit interessiert er sich für Skriptsprachen wie Open Source.
Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.