Quantcast
Channel: Magnus K Karlsson
Viewing all articles
Browse latest Browse all 526

Java EE 7 Performance Monitor with Interceptors, Event and Observes

$
0
0

Lets say you want to performance monitor your business class, that can be achieved with Java EE 7 Interceptors and @Observes. Lets start with the interceptor. Here will only want to encapsulate the actual aggregation and after collecting we use the Java EE 7 Event to send it to the @Observes. A clean separation of concerns.


package se.magnuskkarlsson.example.javaee7;

import javax.enterprise.event.Event;
import javax.inject.Inject;
import javax.interceptor.AroundInvoke;
import javax.interceptor.InvocationContext;

public class PerformanceInterceptor {

@Inject
Event<PerformanceEvent> events;

@AroundInvoke
public Object intercept(InvocationContext ctx) throws Exception {
String className = ctx.getTarget().getClass().getName();
String methodName = ctx.getMethod().getName();
long start = System.currentTimeMillis();
Object object = null;
try {
object = ctx.proceed();
} finally {
long duration = System.currentTimeMillis() - start;
events.fire(new PerformanceEvent(className, methodName, duration));
}
return object;
}
}

And the class that holds the data is a POJO.


package se.magnuskkarlsson.example.javaee7;

public class PerformanceEvent {

private final String clazz;
private final String method;
private final long duration;

public PerformanceEvent(String clazz, String method, long duration) {
this.clazz = clazz;
this.method = method;
this.duration = duration;
}

public String getClazz() {
return clazz;
}

public String getMethod() {
return method;
}

public long getDuration() {
return duration;
}

@Override
public String toString() {
return "PerformanceEvent{" + "clazz=" + clazz + ", method=" + method + ", duration=" + duration + '}';
}

}

And the @Observes.


package se.magnuskkarlsson.example.javaee7;

import java.util.logging.Logger;
import javax.enterprise.event.Observes;

public class PerformanceObserver {

private final Logger log = Logger.getLogger(PerformanceObserver.class.getName());

public void log(@Observes PerformanceEvent event) {
log.info(event.toString());
}

}

And to use in your class that we want to performance measure.


package se.magnuskkarlsson.example.javaee7.control;

import se.magnuskkarlsson.example.javaee7.PerformanceInterceptor;

@Stateless
@Interceptors(PerformanceInterceptor.class)
public class EmployeeBean {

// the public methods we want to measure goes here ...
}

And when we run it


00:37:38,008 INFO [se.magnuskkarlsson.example.javaee7.PerformanceObserver] (default task-9) PerformanceEvent{clazz=se.magnuskkarlsson.example.javaee7.control.EmployeeBean, method=delete, duration=2}

Viewing all articles
Browse latest Browse all 526

Trending Articles