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
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
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 |
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 trazasminThreads
- Numero mínimo de threads en el poolmaxThreads
- Número máximo de threads en el poolsmaxIdleTime
- 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 trazasminThreads
- Numero mínimo de threads en el poolmaxThreads
- 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
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 tareasmaxMillis
- 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