jueves, 12 de agosto de 2010

Usando Servlets Asíncronos con Servlet 3.0

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



En este ejemplo voy a demostrar el uso de Servlets asíncronos.
El uso de este tipo de servlets es para ejecutar funciones callback, es decir para evitar que el código se ejecute de una manera secuencial como se lo hace con los servlets tradicionales.

Primero creamos un nuevo proyecto WEB

Luego creamos una clase llamada ClaseAsincrona, con el siguiente código:
package com.ejemplo;

import javax.servlet.AsyncContext;

public class ClaseAsincrona implements Runnable{

AsyncContext ctx;

public ClaseAsincrona(AsyncContext ctx) {
this.ctx = ctx;
}

public void run() {
try {
Thread.sleep(60000);
System.out.println("Se ejecutara luego de 1 minuto");
} catch (Exception ex) {
ex.printStackTrace();
}
ctx.complete();
}
}


Luego creamos un servlet con el siguiente código:

package com.ejemplo.servlet;

import com.ejemplo.ClaseAsincrona;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import javax.servlet.AsyncContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


@WebServlet(name = "Servlet1", urlPatterns = {"/Servlet1"},asyncSupported=true)
public class Servlet1 extends HttpServlet {

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
AsyncContext aCtx = request.startAsync(request, response);
ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(10);
executor.execute(new ClaseAsincrona(aCtx));

PrintWriter out = response.getWriter();
try {

out.println("<html>");
out.println("<head>");
out.println("<title>Ejemplo de Servlet Asincrónico</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Aqui ejecutamos cualquier proceso y en 1 minuto revise su log de Glassfish"+"</h1 >");
out.println("</body>");
out.println("</html>");

} finally {
out.close();

}
}

// <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}

}


Finalmente ejecutamos el servlet y tendremos la siguiente salida:

y si luego de un minuto revisamos el log de Glassfish.

No hay comentarios:

Publicar un comentario