Administrar dos QuartzJobBean
Buenas tardes,
Tengo dos Job usando QuartzJobBean con Spring los cuales se ejecutan el Job1 cada 1 minute y el Job2 cada 4 minutos, lo que deseo es que si el Job1 no termino no se ejecute el Job2, lo mismo si el Job2 no termino no se ejecute el Job1.
Espero que con estas pocas lineas se entienda y me pueda ayudar.
Desde ya muchas gracias.
- mciccone's blog
- Inicie sesión o regístrese para enviar comentarios
Comentarios
Re: QuartzJobBean
¿Te refieres a detener las ejecuciones futuras de estas dos tareas en caso de algún error?
Si la respuesta es sí, tal vez lo siguiente puede ayudarte:
Obtén la instancia de
org.quartz.Scheduler
a partir del contexto de la tarea (asumiendo que estás extendiendo la claseorg.springframework.scheduling.quartz.QuartzJobBean
):Remueve los tigres... ¿Eh? ... quiero decir, los disparadores (triggers):
scheduler.unscheduleJob("Trigger2", "DEFAULT");
¿Y esas cadenas de dónde salen? A partir de la definición de cada disparador.
<bean id="Trigger2" class="org.springframework.scheduling.quartz.CronTriggerBean"> ... </bean>
Si no se especifica un nombre, por defecto es el valor del
id
del bean. Si no se especifica el grupo, por defecto esDEFAULT
.Tal vez quieras ver también Ejemplo básico Quartz 2.2.1 + Tomcat 7.0.54 (con edición de expresión cron).
P.D.: Las preguntas se deben publicar en los Foros de Discusión. Más detalles en los Lineamientos de publicación.
~~~
QuartzJobBean
Gracias por la respuesta pero no es lo que necesito, en base a tu pregunta es No, la idea es que no se detenga ningun Job, lo que quiero es que NO se ejecuten dos job's en el mismo tiempo, si el Job1 no termino no se debe ejecutar el job2 hasta que el Job1 termine, lo mismo con el Job2, no se debe ejecutar el Job1 hasta que el Job2 termine.
Espero que se entienda.
Gracias.
Sí, bueno... Lo que tú quieras.
Sí, bueno... Lo que tú quieras.
El siguiente fragmento de código puede darte una idea:
try {
Scheduler scheduler = context.getScheduler();
JobDetail jobDetail = scheduler.getJobDetail("Job2", Scheduler.DEFAULT_GROUP);
while (true) {
List<JobExecutionContext> jobs = scheduler.getCurrentlyExecutingJobs();
boolean found = false;
for (JobExecutionContext job : jobs) {
if (job.getTrigger().equals(context.getTrigger()) && job.getJobDetail() != context.getJobDetail()) {
LOG.info("Another instance of the same job: ignored!");
return;
}
if (job.getJobDetail().equals(jobDetail)) {
LOG.info("Waiting...");
Thread.sleep(1000);
found = true;
}
}
if (!found) {
break;
}
}
// Whatever you do, that is, whatever you want :-P
} catch (SchedulerException e) {
LOG.error("Something happened. :-/", e);
} catch (InterruptedException e) {
LOG.error("What a luck! :'(", e);
} catch (OtheException e) {
LOG.error("Now what?", e);
}
}
"Job2"
es el valor del atributoid
de, por ejemplo, una de las siguiente definiciones:<property name="jobClass" value="com.company.app.JobOne" />
</bean>
<bean id="Job2" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass" value="com.company.app.JobTwo" />
</bean>
donde
JobOne
yJobTwo
extienden la claseorg.springframework.scheduling.quartz.QuartzJobBean
.Para evitar que dos instancias de mismo trabajo se ejecuten al mismo tiempo, se ignora la más reciente y si sucede el caso del Original Poster, el trabajo actual (p.ej.:
"Job1"
) se pone en pausa mientras el otro trabajo (p.ej.:"Job2"
) esté en ejecución.~~~
Limitación de Responsabilidad