2012-06-26 19 views
5

Editar: Estoy usando quartz-2.1.5.jar. Aquí está el resumen de mis clases:Quartz Jobs Not Kicking Off

HttpPollingJob extiende PollingJob extiende ScheduledJob implementos org.quartz.Job

Específicamente:

1) ScheduledJob implementa cuarzo Job (clase base abstracta para todos mis Job tipos):

import org.quartz.Job; 
import org.quartz.Trigger; 

public abstract class ScheduledJob implements Job { 
    private Trigger trigger; 

    public ScheduledJob() { 
     this(null); 
    } 

    public ScheduledJob(Trigger trig) { 
     super(); 

     if(trig == null) 
      trig = getDefaultTrigger(); 

     setTrigger(trig); 
    } 

    public Trigger getTrigger() { 
     return trigger; 
    } 

    public void setTrigger(final Trigger trig) { 
     trigger = trig; 
    } 

    protected abstract Trigger getDefaultTrigger(); 
} 

2) PollingJob extiende ScheduledJob - todos los "pollers" sondeo de algún recurso/punto final con una frecuencia específica:

import org.quartz.JobExecutionContext; 
import org.quartz.JobExecutionException; 
import org.quartz.SimpleScheduleBuilder; 
import org.quartz.Trigger; 
import org.quartz.TriggerBuilder; 

import com.me.jobs.ScheduledJob; 

public abstract class PollingJob extends ScheduledJob { 
    private static long DEF_FREQUENCY = 10 * 1000; // 10 secs 
    private String name;  
    private long frequency; 

    public PollingJob(final String nm) { 
     this(nm, DEF_FREQUENCY); 
    } 

    public PollingJob(final String nm, final long freq) { 
     super(); 

     setName(nm); 
     setFrequency(freq); 
    } 

    public abstract void poll(JobExecutionContext context); 

    @Override 
    public void execute(JobExecutionContext context) throws JobExecutionException { 
     poll(context);  
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(final String nm) { 
     name = nm; 
    } 

    public long getFrequency() { 
     return frequency; 
    } 

    public void setFrequency(final long freq) { 
     frequency = freq; 
    } 

    protected final Trigger getDefaultTrigger() { 
     TriggerBuilder<?> triggerBuilder = TriggerBuilder.newTrigger() 
      .startNow() 
      .withSchedule(SimpleScheduleBuilder.simpleSchedule() 
      .withIntervalInMilliseconds(DEF_FREQUENCY)); 

     return triggerBuilder.build(); 
    } 
} 

3) HttpPollingJob extiende PollingJob - "HTTP pollers" sondeo de un servidor web (utilizando HttpClient):

import org.apache.http.HttpResponse; 
import org.apache.http.HttpStatus; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.quartz.JobExecutionContext; 

import com.me.MonitoredEvent; 
import com.me.MonitoredEventRegistrar; 

public class HttpPollingJob extends PollingJob { 
    private String serverURL; 
    private org.slf4j.Logger logger = 
     org.slf4j.LoggerFactory.getLogger(HttpPollingJob.class); 

    public HttpPollingJob(final String nm, final String server) { 
     super(nm); 

     setServerURL(server); 
    } 

    public String getServerURL() { 
     return serverURL; 
    } 

    public void setServerURL(final String server) { 
     serverURL = server; 
    } 

    @Override 
    public final void poll(JobExecutionContext context) { 
     MonitoredEvent event = null; 

     try { 
      // This is where we would use HttpClient to connect to a web server and poll it. 
      System.out.println("Job fired!"); 
     } 
     catch(Throwable thrown) { 
      logger.error(thrown.getMessage()); 
     } 
    } 
} 

4) JobDriver - define varios HttpPollingJob s y utiliza cuarzo para iniciarlos:

public class JobDriver { 
    private List<HttpPollingJob> jobs; 

    public JobDriver() { 
     HttpPollingJob job1 = new HttpPollingJob("job-1", "http://www.example.com/1"); 
     HttpPollingJob job2 = new HttpPollingJob("job-2", "http://www.example.com/2"); 
     HttpPollingJob job3 = new HttpPollingJob("job-3", "http://www.example.com/3"); 

     jobs = new ArrayList<HttpPollingJob>(); 
     jobs.add(job1); 
     jobs.add(job2); 
     jobs.add(job3); 
    } 

    public static void main(String[] args) { 
    JobDriver driver = new JobDriver(); 
     driver.startJobs(); 
    } 

    private void startJobs() { 
     try { 
      // Obtain a basic SchedulerFactory and fire it up. 
      SchedulerFactory schedulerFactory = new org.quartz.impl.StdSchedulerFactory(); 
      Scheduler scheduler = schedulerFactory.getScheduler(); 
      scheduler.start(); 

      // Define a job for every declared monitor. 
      JobBuilder jobBuilder = null; 

      for(ScheduledJob job : jobs) { 

      Trigger trigger = job.getTrigger(); 
      jobBuilder = JobBuilder.newJob(job.getClass()); 

      // Bind the current job to this trigger. 
      scheduler.scheduleJob(jobBuilder.build(), trigger); 

      // TODO: Shut the scheduler down politely?!?! 
     } 
     catch(Throwable exc) { 
      logger.error(exc.getMessage()); 

      // Force application to kick out. 
      throw new RuntimeException(exc); 
     } 
    } 
} 

Cuando ejecuto este código obtengo un inicio perfecto sin errores ni excepciones de tiempo de ejecución. Si espolvoreo las declaraciones System.out.println, puedo ver que cada línea de código se ejecuta sin problemas. El único problema es que, una vez que el programa se está ejecutando, no está imprimiendo el mensaje "¡Trabajo disparado!" que indica que el trabajo de sondeo está comenzando.

He intentado todas las combinaciones de start() y shutdown() puedo pensar en vano. ¿Alguno de los genios del Quartz puede ver este código y decirme por qué el trabajo no se está disparando?

En los registros (configuré log4j) veo el hilo de trabajo Quartz que se está creando para el trabajo programado. Siento que estoy al 99% del camino pero me falta algo obvio. ¡Gracias por adelantado!

+3

Eso no es justo, primero di la respuesta correcta. ¿Cómo se puede otorgar generosidad a una respuesta que se da después de cerrar la recompensa? poco ético – mtariq

Respuesta

0

Sus sus constructores - el JobBuilder busca la no-args y ya que no están definidos que se niega a construye los trabajos. Agregue códigos vacíos sin argumentos y ya está todo listo.

+0

hombre ... @mtariq respondió primero. –

3

Aparentemente, no ha iniciado el disparador. Ver Quartz Tutorial o Javadocs:

// Trigger the job to run now, and then every 40 seconds 
    Trigger trigger = newTrigger() 
     .withIdentity("myTrigger", "group1") 
     .startNow() 
     .withSchedule(simpleSchedule() 
      .withIntervalInSeconds(40) 
      .repeatForever())    
     .build(); 
+0

Esto todavía no está funcionando ... ¿Alguna otra idea? +1 para la ayuda de todos modos! – IAmYourFaja

+0

@ 4herpsand7derpsago Comparta su código más reciente, por favor – Andy

0

Podría tratar de cambiar el código del método getDefaultTrigger en la clase PollingJob en lo siguiente:

protected final Trigger getDefaultTrigger() { 

return TriggerBuilder.newTrigger() 
     .withSchedule(SimpleScheduleBuilder.simpleSchedule() 
     .withIntervalInMilliseconds(DEF_FREQUENCY)) 
     .startAt(DateBuilder.futureDate(1, DateBuilder.IntervalUnit.SECOND)) 
     .build(); 
} 
0

me siento algún problema con la forma en que se crea el gatillo. recuerde que no puede volver a utilizar detonante de varios trabajos

Trate de crear gatillo con identidad y grupo único, como a continuación

gatillo everyHourTrigger = newTrigger(). WithIdentity ("everyWeeklyTrigger", "grupo 1") .startNow(). withSchedule (cronSchedule ("0 1 * * *?")).construir();

10

@ 4herpsand7derpsago sí tienes razón, usted es el 99% allí, me encontré con su código y sólo hay un problema en el mismo, los constructores por defecto están ausentes en HttpPollingJob y PollingJob clases, para que Programador razón no es capaz de crear sus instancias,

simple solución complementaria siguiente código en las clases siguientes
HttpPollingJob clase

public HttpPollingJob() { 
} 

PollingJob clase

public PollingJob() { 
} 

Bingo, se imprimirán los siguientes mensajes

Job fired!
Job fired!
Job fired!

Si desea repetir el gatillo, añadir siguiente código en PollingJob

protected final Trigger getDefaultTrigger() { 
    TriggerBuilder<?> triggerBuilder = TriggerBuilder 
      .newTrigger() 
      .startNow() 
      .withSchedule(
        SimpleScheduleBuilder.simpleSchedule() 
          .withIntervalInMilliseconds(DEF_FREQUENCY).repeatForever()); 

    return triggerBuilder.build(); 
} 

Con la esperanza de que ahora voy a recibir la recompensa :)

PRIMA
parece que desea sondear o hacer algo con las direcciones URL, Una mejor manera de pasar que el uso de rey JobDataMap

Actualizado JobDriver

import java.util.ArrayList; 
import java.util.List; 

import org.quartz.JobBuilder; 
import org.quartz.Scheduler; 
import org.quartz.SchedulerFactory; 
import org.quartz.Trigger; 

public class JobDriver { 
private List<HttpPollingJob> jobs; 

public JobDriver() { 
    HttpPollingJob job1 = new HttpPollingJob("job-1", 
      "http://www.example.com/1"); 
    HttpPollingJob job2 = new HttpPollingJob("job-2", 
      "http://www.example.com/2"); 
    HttpPollingJob job3 = new HttpPollingJob("job-3", 
      "http://www.example.com/3"); 

    jobs = new ArrayList<HttpPollingJob>(); 
    jobs.add(job1); 
    jobs.add(job2); 
    jobs.add(job3); 
} 

public static void main(String[] args) { 
    JobDriver driver = new JobDriver(); 
    driver.startJobs(); 
} 

private void startJobs() { 
    try { 
     // Obtain a basic SchedulerFactory and fire it up. 
     SchedulerFactory schedulerFactory = new org.quartz.impl.StdSchedulerFactory(); 
     Scheduler scheduler = schedulerFactory.getScheduler(); 
     scheduler.start(); 
     // Define a job for every declared monitor. 
     JobBuilder jobBuilder = null; 

     for (HttpPollingJob job : jobs) { 

      Trigger trigger = job.getTrigger(); 
      jobBuilder = JobBuilder.newJob(job.getClass()); 
      jobBuilder.usingJobData("name", job.getName()); 
      jobBuilder.usingJobData("url", job.getServerURL()); 

      // Bind the current job to this trigger. 
      scheduler.scheduleJob(jobBuilder.build(), trigger); 

      // TODO: Shut the scheduler down politely?!?! 
     } 


    } catch (Throwable exc) { 
     // Force application to kick out. 
     throw new RuntimeException(exc); 
    } 
} 
} 

actualizado HttpPollingJob

import java.util.Map; 

import org.quartz.JobExecutionContext; 

public class HttpPollingJob extends PollingJob { 
private String serverURL; 
private org.slf4j.Logger logger = 
    org.slf4j.LoggerFactory.getLogger(HttpPollingJob.class); 

public HttpPollingJob(final String nm, final String server) { 
    super(nm); 

    setServerURL(server); 
} 
public HttpPollingJob() { 
} 

public String getServerURL() { 
    return serverURL; 
} 

public void setServerURL(final String server) { 
    serverURL = server; 
} 

@Override 
public final void poll(JobExecutionContext context) { 

    try { 
     Map dataMap = context.getJobDetail().getJobDataMap(); 
     String nm = (String)dataMap.get("name"); 
     String url = (String)dataMap.get("url"); 
     // This is where we would use HttpClient to connect to a web server and poll it. 
     System.out.println("Job fired! name:"+nm+" url:"+url); 
    } 
    catch(Throwable thrown) { 
     logger.error(thrown.getMessage()); 
    } 
} 
} 

nueva salida

Job fired! name:job-1 url:http://www.example.com/1
Job fired! name:job-2 url:http://www.example.com/2
Job fired! name:job-3 url:http://www.example.com/3

+0

@ 4herpsand7derpsago ¿verificó mi respuesta? – mtariq