com.ejie.r01f.process
Class JobManager

java.lang.Object
  extended bycom.ejie.r01f.process.JobManager

public class JobManager
extends java.lang.Object

Clase que ejecuta operaciones sobre objetos en base a un pool de threads que se encargan de procesar trabajos: Se pueden ir poniendo en cola trabajos que son procesados por threads del pool IMPORTANTE!!! Si el trabajo que realiza el thread es de CALCULO (el for en este ejemplo), las ventajas del pool de threads NO se aprecian (incluso va peor) En cambio si el trabajo es intensivo en IO por ejemplo, las ventajas son enormes (en el ejemplo, dormir el thread) Ej 1: for (int i=0; iSe comienza la ejecución de los trabajos!!!"); jobManager.waitForAll(schedulledJobs,1000); // Esto bloquea AQUI la ejecución hasta // la finalización de todos los trabajos R01FLog.to("r01f.test").fine("\r\n\r\n\r\n\r\n\r\n---->Se han ejecutado todos los trabajos!!!"); // ======== FORMA HABITUAL DE OBTENER LOS RESULTADOS // ======== (además del CallBack) for (Iterator it = schedulledJobs.iterator(); it.hasNext(); ) { Job currJob = (Job)it.next(); // Cuidado: El resultado del trabajo puede ser una excepcion!!! try { if (currJob.isEnded()) { Object result = currJob.getResult(); R01FLog.to("r01f.test").fine("Resultado>>>>> " + result); } else { R01FLog.to("r01f.test").fine("El trabajo " + currJob.getId() + " NO se ha terminado!!"); } } catch(Exception ex) { ex.printStackTrace(System.out); } } // =================== Segunda forma de ejecución: ASINCRONA // Lanzar su ejecucion SIN bloquear el flujo hasta que se terminen todos R01FLog.to("r01f.test").fine("\r\n\r\n\r\n\r\n\r\n---->Se comienza la ejecución de los trabajos!!!"); jobManager.startAll(schedulledJobs); // Esto NO bloquea AQUI la ejecución hasta // la finalización de todos los trabajos // El flujo sigue R01FLog.to("r01f.test").fine("\r\n\r\n\r\n\r\n\r\n---->NO se sabe si se han ejecutado todos los trabajos!!!"); // NOTA: Se puede seguir utilizando la forma habitual de recojer los resultados, pero ANTES HAY QUE ASEGURARSE DE QUE SE HAN TERMINADO TODOS LOS TRABAJOS JobManager.Stats stats = null; try { do { stats = jobManager.getStats(); // Volver a obtener estadisticas!! R01FLog.to("r01f.test").fine(">>>>Estadisticas de la ejecución de trabajos\r\n" + stats.composeDebugInfo() + "\r\n----------------------------------------------------->"); if (stats.jobsInProgress > 0) Thread.sleep(1000); } while (stats.jobsInProgress > 0); R01FLog.to("r01f.test").fine("---->Todos los trabajos han terminado!!!"); // Aqui ya se pueden recoger los resultados } catch(InterruptedException intEx) { intEx.printStackTrace(System.out); } IMPORTANTE: Tiempos de idle: Si en el constructor del JobManager se especifica un tiempo máximo de permanencia en estado idle de un thread pueden pasar dos cosas: - Si minThreads es -1 y no hay trabajos pendientes, el thread se mata - Si minThreads != -1 y el pool de threads está lleno, el thread se mata OJO!!! Si no se especifica minThreads = -1, SIEMPRE habrá corriendo tantos threads como quepan en el pool


Nested Class Summary
 class JobManager.Stats
           
 
Constructor Summary
JobManager(boolean debug, int minThreads, int maxThreads)
          Constructor
JobManager(boolean debug, int minThreads, int maxThreads, int maxIdleTime)
          Constructor...
JobManager(java.util.Properties props)
          Constructor...
 
Method Summary
 Job findJobById(java.lang.String jobId)
          Busca un trabajo por su id dentro de la cola de trabajos pendientes Si el trabajo no existe o ya se ha ejecutado, devuelve null
 JobManager.Stats getStats()
          Obtiene las estadísticas del pool de threads
 void purgeAvailableThreadPool()
          Limpia el pool de threads disponibles
 void startAll(java.util.List jobList)
          Comienza la ejecución de todos los trabajos planificados y devuelve el control....
 void startJob(Job theJob)
          Planifica la ejecucion de un trabajo
 void waitForAll(java.util.List jobList, long testMillis)
           
 void waitForAll(java.util.List jobList, long testMillis, long maxMillis)
          Espera (bloquea la ejecución del llamante) hasta que finalicen todos los trabajos planificados
 
Methods inherited from class java.lang.Object
equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

JobManager

public JobManager(boolean debug,
                  int minThreads,
                  int maxThreads,
                  int maxIdleTime)
           throws java.lang.NumberFormatException,
                  java.lang.IllegalArgumentException
Constructor... A partir del numero mínimo y maximo de elementos en el pool, así como del tiempo máximo que un thread puede estar idle

Parameters:
debug - indica si hay que sacar trazas
minThreads - Numero mínimo de threads en el pool
maxThreads - Número máximo de threads en el pools
maxIdleTime - Tiempo máximo que un thread puede estar idle
Throws:
java.lang.IllegalArgumentException - Si alguno de los argumentos no es valido
java.lang.NumberFormatException

JobManager

public JobManager(boolean debug,
                  int minThreads,
                  int maxThreads)
           throws java.lang.IllegalArgumentException
Constructor

Parameters:
debug - indica si hay que sacar trazas
minThreads - Numero mínimo de threads en el pool
maxThreads - Número máximo de threads en el pools
Throws:
java.lang.IllegalArgumentException - Si alguno de los argumentos no es valido

JobManager

public JobManager(java.util.Properties props)
           throws java.lang.NumberFormatException,
                  java.lang.IllegalArgumentException
Constructor... Simplemente carga las propiedades

Method Detail

purgeAvailableThreadPool

public void purgeAvailableThreadPool()
Limpia el pool de threads disponibles


waitForAll

public void waitForAll(java.util.List jobList,
                       long testMillis,
                       long maxMillis)
Espera (bloquea la ejecución del llamante) hasta que finalicen todos los trabajos planificados

Parameters:
jobList - La lista de trabajos a ejecutar en paralelo y sobre los que hay que esperar la finalizacion de la ejecucion IMPORTANTE!!! Los trabajos se suman a aquellos trabajos que esten tambien planificados y en ejecución de forma que se esperará a la finalización de TODOS los trabajos (los que habia y los nuevos)
testMillis - Milisegundos que se espera entre comprobación y comprobación de la finalización de las tareas
maxMillis - Tiempo máximo que se espera la terminación de los trabajos (si es -1 se toma un tiempo Long.MAX_VALUE)

waitForAll

public void waitForAll(java.util.List jobList,
                       long testMillis)
See Also:
waitForAll(List, long, long)

startAll

public void startAll(java.util.List jobList)
Comienza la ejecución de todos los trabajos planificados y devuelve el control....


startJob

public void startJob(Job theJob)
Planifica la ejecucion de un trabajo

Parameters:
theJob - Ele trabajo a ejecutar

findJobById

public Job findJobById(java.lang.String jobId)
Busca un trabajo por su id dentro de la cola de trabajos pendientes Si el trabajo no existe o ya se ha ejecutado, devuelve null

Parameters:
jobId - El identificador del trabajo
Returns:
La definicion del trabajo o null si el trabajo no se encuentra o ya se ha ejecutado

getStats

public JobManager.Stats getStats()
Obtiene las estadísticas del pool de threads

Returns:
una estructura con las estadisticas de utilizacion del pool de worker threads