Inconveniente con Quartz

Iniciado por Lind L. Tailor, 6 Mayo 2015, 19:49 PM

0 Miembros y 2 Visitantes están viendo este tema.

Lind L. Tailor

Hola...

Como están mis estimados compañeros, espero que estén teniendo un día agradable pero sobre todo espero que su código este ejecutándose correctamente ;D...

Mi problema radica en la implementación de hilos mediante el uso de la librería llamada Quartz, explico brevemente el framework... Quartz, es una librería que permite ejecutar trabajos o tareas mediante un tiempo de terminado, podemos decir que en esencia viene siendo lo que conocemos en Java como un Timer/TimerTask. Primeramente necesitamos una clase que implemente la interface Job, la cual tiene como método execute(), el cual va a contener nuestro acción a ejecutar. Posteriormente necesitamos una clase que ademas de contener el famoso método main, contiene la configuración de nuestro trabajo a ejecutar, tal y como podemos ver a continuación... (Creo que si fue breve xD)

Carga.java
Código (java) [Seleccionar]

public class Carga implements Job {

public void execute(JobExecutionContext context) throws JobExecutionException {
for(int i = 0; i < 10000; i++){
try {
Thread.sleep(10);
System.out.println("Index: " + i);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}


CargaMain.java
Código (java) [Seleccionar]

public static void main(String[] args) throws SchedulerException {
Scheduler scheduler = new StdSchedulerFactory().getScheduler();

Trigger trigger = TriggerBuilder.newTrigger().withSchedule(
SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(10).repeatForever()).build();

JobDetail prueba = JobBuilder.newJob(Carga.class).withIdentity("hola","adios").build();

scheduler.scheduleJob(prueba, trigger);
scheduler.start();
}


Como podemos ver, únicamente quiero una impresión de números en pantalla el cual si ejecutamos podemos ver en consola la salida de manera correcta, sin embargo, podemos ver que cuando pasan los 10 segundos que es el intervalo en que se va a ejecutar, se dispara nuevamente y vemos en pantalla algo parecido a lo siguiente...

Index: 0
Index: 793
Index: 1
Index: 794
Index: 2
Index: 795
Index: 3
Index: 796
Index: 4
Index: 797
Index: 5
...

A simple vista sabemos que el error es que no controlamos las llamadas por lo tanto podemos ver como se intercalan los números, para ello eh indago por Internet para controlar lo mencionado anteriormente y afortunadamente encontré la "solución" ante tal  inconveniente, incluso podemos decir que la solución es universal ya que en todos los temas que eh encontrado relacionado a este problema mencionan el mismo bloque de código, dejando el código de CargaMain de la siguiente manera...

CargaMain.java
Código (java) [Seleccionar]

public static void main(String[] args) throws SchedulerException {
Scheduler scheduler = new StdSchedulerFactory().getScheduler();

Trigger trigger = TriggerBuilder.newTrigger().withSchedule(
SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(10).repeatForever()).build();

JobDetail prueba = JobBuilder.newJob(Carga.class).withIdentity("hola","adios").build();
if (prueba != null) {
        List<JobExecutionContext> currentlyExecutingJobs = (List<JobExecutionContext>) scheduler.getCurrentlyExecutingJobs();
        for (JobExecutionContext jec : currentlyExecutingJobs) {
            if(prueba.equals(jec.getJobDetail())) {
               System.out.println("RUNNING...");
            }
        }
    }

scheduler.scheduleJob(prueba, trigger);
scheduler.start();
}


Sin embargo, el resultado es el mismo :(, no controla la llamada como debería ser, mi pregunta es ¿Cual sería la forma correcta de adaptar del código? ya que como lo estoy haciendo no cabe duda que es la errónea.

Ahora bien, tengo entendido que me estoy complicando la vida y puedo hacer uso de la clase TimerTask para representar lo que necesito arriba, tal y como podemos ver a continuación...

Código (java) [Seleccionar]

public class Carga extends TimerTask{
public static Timer timer;

public static void main(String[] args) {
TimerTask tasknew = new Carga();
timer = new Timer();
timer.scheduleAtFixedRate(tasknew,500,1000);
}

public void run() {
try {
for (int i = 0; i < 1000; i++){
Thread.sleep(10);
System.out.println("Index: " + i);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}


Si ejecutamos lo siguiente vemos que imprime correctamente los primeros 1000 números e inmediatamente los próximos 1000 si el tiempo es muy corto, mi otra pregunta es... ¿Cual el proceso interno que realiza Java para el TimerTask de tal forma que si obtenga lo que necesito a diferencia de Quartz?

Disculpen mi pregunta pero la API no me ah ayudado mucho a comprender y despejar mis dudas...

Lind L. Tailor

Gracias por el tiempo dedicado a leer este tema, sin embargo, paso a cerrarlo ya que "encontré" la respuesta.