AspectJ
Jump to navigation
Jump to search
- Introduction : https://eclipse.org/aspectj/doc/next/progguide/starting-aspectj.html
- Getting Started : https://eclipse.org/aspectj/doc/next/progguide/starting.html
Avec Maven
Installer Maven
Tester l'exemple suivant
git clone https://github.com/jbellmann/aspectj-examples.git cd aspectj-examples/ mvn clean install
Changer aspectj-examples/application/src/main/java/de/jbellmann/application/Main.java par https://docs.oracle.com/javase/tutorial/essential/concurrency/simple.html
public class SimpleThreads {
// Display a message, preceded by
// the name of the current thread
static void threadMessage(String message) {
String threadName =
Thread.currentThread().getName();
System.out.format("%s: %s%n",
threadName,
message);
}
private static class MessageLoop
implements Runnable {
public void run() {
String importantInfo[] = {
"Mares eat oats",
"Does eat oats",
"Little lambs eat ivy",
"A kid will eat ivy too"
};
try {
for (int i = 0;
i < importantInfo.length;
i++) {
// Pause for 4 seconds
Thread.sleep(4000);
// Print a message
threadMessage(importantInfo[i]);
}
} catch (InterruptedException e) {
threadMessage("I wasn't done!");
}
}
}
public static void main(String args[])
throws InterruptedException {
// Delay, in milliseconds before
// we interrupt MessageLoop
// thread (default one hour).
long patience = 1000 * 60 * 60;
// If command line argument
// present, gives patience
// in seconds.
if (args.length > 0) {
try {
patience = Long.parseLong(args[0]) * 1000;
} catch (NumberFormatException e) {
System.err.println("Argument must be an integer.");
System.exit(1);
}
}
threadMessage("Starting MessageLoop thread");
long startTime = System.currentTimeMillis();
Thread t = new Thread(new MessageLoop());
t.start();
threadMessage("Waiting for MessageLoop thread to finish");
// loop until MessageLoop
// thread exits
while (t.isAlive()) {
threadMessage("Still waiting...");
// Wait maximum of 1 second
// for MessageLoop thread
// to finish.
t.join(1000);
if (((System.currentTimeMillis() - startTime) > patience)
&& t.isAlive()) {
threadMessage("Tired of waiting!");
t.interrupt();
// Shouldn't be long now
// -- wait indefinitely
t.join();
}
}
threadMessage("Finally!");
}
}
Ajouter les aspects suivants dans aspectj-examples/aspects/src/main/java/de/jbellmann/aspects
package de.jbellmann.aspects;
public aspect DurationAspect {
private long startTime;
private long count = 0;
before() : execution(public void *.run()){
start=System.nanoTime();
count++;
}
after() : execution(public void *.run()){
endTime=System.nanoTime();
System.out.println("Call #" + count + ": Duration=" + (endTime-startTime)/1000000);
}
}
Transformer l'aspect précédent pour créer un quota d'utilisation du temps passé dans la méthode void run(). Un paramêtre est un débit maximun par appel (cumulé depuis le démarrage du programme). Tester s'il y a dépassement en début d'appel (before()) et si besoin mettre en sommeil la thread la durée nécessaire (Thread.sleep(millisec)).
QuotaAspect.aj
TODO