style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

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.

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

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:

  1. Obtén la instancia de org.quartz.Scheduler a partir del contexto de la tarea (asumiendo que estás extendiendo la clase org.springframework.scheduling.quartz.QuartzJobBean):

    Scheduler scheduler = context.getScheduler();
  2. Remueve los tigres... ¿Eh? ... quiero decir, los disparadores (triggers):

    scheduler.unscheduleJob("Trigger1", "DEFAULT");
    scheduler.unscheduleJob("Trigger2", "DEFAULT");

    ¿Y esas cadenas de dónde salen? A partir de la definición de cada disparador.

    <bean id="Trigger1" class="org.springframework.scheduling.quartz.CronTriggerBean"> ... </bean>
    <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 es DEFAULT.


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.

lo que quiero es que NO se ejecuten dos job's en el mismo tiempo

Sí, bueno... Lo que tú quieras.

El siguiente fragmento de código puede darte una idea:

public void executeInternal(JobExecutionContext context) throws JobExecutionException {
    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 atributo id de, por ejemplo, una de las siguiente definiciones:

<bean id="Job1" class="org.springframework.scheduling.quartz.JobDetailBean">
    <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 y JobTwo extienden la clase org.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

Limitación de Responsabilidad
EL SOFTWARE SE PROPORCIONA "TAL CUAL", SIN GARANTÍA DE NINGÚN TIPO, EXPRESA O IMPLÍCITA. EL AUTOR DECLINA EXPRESAMENTE TODA RESPONSABILIDAD.

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">