Overview | Package | Class | Use | Tree | Deprecated | Index | Help
PREV CLASS NEXT CLASS | FRAMES NO FRAMES
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD

## com.ejie.r01f.process
Class JobManager

    java.lang.Object
      com.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 System.out.println("\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(); System.out.println("Resultado>>>>> " + result); } else { System.out.println("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 System.out.println("\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 System.out.println("\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!! System.out.println(">>>>Estadisticas de la ejecución de trabajos\r\n" + stats.composeDebugInfo() + "\r\n----------------------------------------------------->"); if (stats.jobsInProgress > 0) Thread.sleep(1000); } while (stats.jobsInProgress > 0); System.out.println("---->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

Overview | Package | Class | Use | Tree | Deprecated | Index | Help
PREV CLASS NEXT CLASS | FRAMES NO FRAMES
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD