lunes, 13 de junio de 2011

Usando Interceptores de Negocio(Business Interceptors)

Para este ejemplo estoy usando Ubuntu 10.04, Netbeans 6.9 y Glassfish V3

La idea de usar interceptores en una aplicación EJB es la misma que usar Filtros en un aplicación Web.
Para ilustrar el uso de interceptores vamos a crear un Projecto Empresarial en Netbeans.
Ahora creamos un Stateless Session Bean con una interface remota, en el paquete com.ejemplo.ejb. Llamaremos al EJB como Utilitario

Hecho esto vamos a crear un metodo llamado mostrarMensaje(), que tiene un parámetro del tipo String.





La clase EJB nos quedará de la siguiente manera:

package com.ejemplo;

import javax.ejb.Stateless;

@Stateless
public class Utilitario implements UtilitarioRemote {
public void mostrarMensaje(String cadena) {
System.out.println("El parametro ingresado es:"+cadena);
}
}

Luego de esto desde el cliente EJB hacemos una Inyección EJB y llamamos al EJB Utilitario
Con lo cual el código nos queda como:

package interceptoresnegocio;

import com.ejemplo.UtilitarioRemote;
import javax.ejb.EJB;

public class Main {

@EJB private static UtilitarioRemote bean;
public static void main(String[] args) {
bean.mostrarMensaje("Esta es una prueba");
}

}

Luego ejecutamos el ejemplo y tenemos la siguiente salida:
INFO: El parametro ingresado es:Esta es una prueba


Hasta ahora nada de ciencia, pero en este momento vamos a cambiar el mensaje que se imprime

Primeramente, tenemos que crear un clase. Para esto damos boton derecho sobre el proyecto EJB y seleccionamos New Java Class.
Le damos el nombre de Interceptor1 y le creamos dentro del paquete:com.ejemplo.interceptores


La clase interceptora usa la anotación:@AroundInvoke y la clase InvocationContext, para obtener información de environment, por ejemplo: los métodos y los parámetros. Además siempre siempre debe devolver la función proceed de InvocationContext.
La clase interceptora, tendrá el siguiente código:

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package com.ejemplo.interceptores;

import javax.interceptor.AroundInvoke;
import javax.interceptor.InvocationContext;

/**
*
* @author santiago
*/
public class Interceptor1 {
@AroundInvoke
public Object interceptorClase(InvocationContext inv) throws Exception {
long tiempoInicio = System.currentTimeMillis();
String nombreFuncion = "";
Object[] parametros = null;
try {
nombreFuncion = inv.getMethod().getName();
parametros = inv.getParameters();
return inv.proceed();
} finally {
long tiempo = tiempoInicio - System.currentTimeMillis();
System.out.println(inv.getMethod() + " La ejecución en la clase Interceptora1 de la función "
+ nombreFuncion + " tomó:" + tiempo + "milliseconds.");
System.out.println("Con los parametros:"
+ java.util.Arrays.toString(parametros));
}
}
}

Hecho esto vamos a usar la anotación @Interceptors en la clase EJB que implementa la interface remota.Con lo que la clase nos queda como:

package com.ejemplo;

import javax.ejb.Stateless;
import javax.interceptor.Interceptors;

@Stateless
@Interceptors({
com.ejemplo.interceptores.Interceptor1.class
})
public class Utilitario implements UtilitarioRemote {

public void mostrarMensaje(String cadena) {
System.out.println("El parametro ingresado es:"+cadena);
}
}

Si ejecutamos la clase Main, veremos que en la consola nos sale la información del tiempo de ejecución de la clase



Ahora vamos a cambiar el valor del parámetro de la función mostrarMensaje por medio de un nuevo Interceptor.
Para esto creamos una clase que se llame InterceptorParametro de la misma manera que creamos la clase Interceptor1. Es decir:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package com.ejemplo.interceptores;

import javax.interceptor.AroundInvoke;
import javax.interceptor.InvocationContext;

/**
*
* @author santiago
*/
public class InterceptorParametro {

@AroundInvoke
public Object interceptorClase(InvocationContext inv) throws Exception {
try {
Object[] parametros = inv.getParameters();
parametros[0] = "Valor cambiado por el Interceptor";
inv.setParameters(parametros);
} finally {
return inv.proceed();
}
}
}

y agregamos el nuevo interceptor en la clase Utilitario, es decir:

package com.ejemplo;

import javax.ejb.Stateless;
import javax.interceptor.Interceptors;

@Stateless
@Interceptors({
com.ejemplo.interceptores.Interceptor1.class,
com.ejemplo.interceptores.InterceptorParametro.class
})
public class Utilitario implements UtilitarioRemote {

public void mostrarMensaje(String cadena) {
System.err.println("El parametro ingresado es:"+cadena);
}
}

y ejecutamos la Enterprise Application:
y obtenemos la siguiente salida:
SEVERE: El parametro ingresado es:Valor cambiado por el Interceptor

No hay comentarios:

Publicar un comentario