Ver Mensaje Individual
  #2 (permalink)  
Antiguo 01/04/2011, 22:33
epilefreyes
 
Fecha de Ingreso: abril-2011
Mensajes: 14
Antigüedad: 13 años
Puntos: 0
Respuesta: Servlet de larga duración

Hola Moisesvs...

Bueno, hay un par de cosas a tener en cuenta:
  1. Si lo que necesitas es que quien te llama se quede esperando una respuesta, no utilices un hilo. Un hilo se utiliza cuando quien invoca no espera una respuesta inmediata, sino espera hacer un nuevo llamado para obtener la respuesta cuando el proceso "largo" sea terminado.
  2. Si la idea es que el proceso es muy largo, y no se debería quedar esperando (o hay riesgo de vencer la sesión o algo así) simplemente utiliza la técnica de enviar un token: al momento que te hacen la solicitud, generas el nuevo hilo con un "token" (puede ser un simple número entero, que tengas estático para que cada vez generes un nuevo valor sin importar la cantidad de llamados) y le contestas inmediatamente al usuario con el token. El token sirve para que vuelvan a llamar a preguntar "en qué va la cosa" enviándote el token como referencia, y, cuando el asunto ya esté listo, puedas efectivamente contestarle al usuario.

En el método de Token, la idea es que el hilo escriba sus resultados en una tabla en memoria (por ejemplo, un HashMap que relacione el Token con el resultado) cuando el resultado esté listo, y así el usuario remoto podrá seguir preguntando hasta obtener la respuesta.

Ejemplo:
Código:
    private static int token;

    private static HashMap<Integer,String> tablaResultados;

    private class TareaMuyLarga extends Thread{

        int tokenLocal;

        public TareaMuyLarga(int tokenLocal){
            this.tokenLocal = tokenLocal;
        }

        public void Run(){

        ... (Se genera "resultadoLocal" con el resultado)
        tablaResultados.put(new Integer(tokenLocal),resultadoLocal);
        }

    }
Faltaría que el servlet retornara la información como se considere que deba hacerse...

Si la idea es presentar información en una página web, es perfectamente válido efectuar llamados periódicos (por ejemplo, cada 5 segundos) para preguntar el estado: esto es justamente lo que hace Ajax, aunque "por debajo".

Espero que esta información te sea útil.