Los EJB Async forman parte de Java EE 6 y permiten realizar peticiones de forma asíncrona, algo que a veces necesario . Vamos a crear un EJB que tenga un método que funciona de forma asíncrona:
package com.arquitecturajava.ejb;
import java.util.concurrent.Future;
import javax.ejb.AsyncResult;
import javax.ejb.Asynchronous;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
/**
* Session Bean implementation class EJBAsincrono
*/@Stateless
@LocalBean
public class EJBAsincrono implements EJBAsincronoLocal {
@Override
@Asynchronous
public void  metodoLento() {
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("que lento va esto");
}
}
Invocando un EJB Async
Acabamos de crear nuestro primer EJB Asíncrono utilizando la anotacion @Asyncronous . En este caso tenemos un método que tarda 10 segundos en ejecutarse. Vamos a invocar este EJB desde un Servlet , en principio el Servlet debería tardar 10 segundos en ejecutarse ya que el EJB duerme 10 segundos . Sin embargo al tratarse de un EJB asíncrono el Servlet no se verá bloqueado y devolverá un mensaje de forma inmediata.
Vamos a ver como se construye el código del Servlet y como invoca al EJB:
package com.arquitecturajava.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.arquitecturajava.ejb.EJBAsincronoLocal;
@WebServlet("/ServletEJBAsync")
public class ServletEJBAsync extends HttpServlet {
private static final long serialVersionUID = 1L;
@EJB
EJBAsincronoLocal ejb;
public ServletEJBAsync() {
super();
// TODO Auto-generated constructor stub
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ejb.metodoLento();
PrintWriter pw= response.getWriter();
pw.println("invocacion Asincrona");
pw.close();
}
}
El Servlet nos devolverá el resultado de forma inmediata :
Mientras por el otro lado el mensaje saldrá en en la consola del servidor de aplicaciones al cabo de 10 segundos.
Los EJBs asíncronos pueden sernos útiles a la hora de realizar tareas cuyo tiempo de ejecución se dispare o en situaciones en las que tenemos que realizar varias tareas de forma asíncrona y luego enlazarlas.
Otros artículos relacionados: