2012-06-26 7 views
5

Редактировать: Я использую quartz-2.1.5.jar. Вот краткое изложение моих классов:Работа с кварцем не сбрасывается

HttpPollingJob расширяет PollingJob расширяет ScheduledJob орудия org.quartz.Job

В частности:

1) ScheduledJob реализует Quartz Job (абстрактный базовый класс для всех моих Job типов):

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 расширяет ScheduledJob - все "Пуллеры" опрос некоторых ресурсов/конечной точки с определенной частотой:

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 расширяет PollingJob - "HTTP-Пуллеры" опрос веб-сервер (с использованием 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 - определяет несколько HttpPollingJob с и использует кварц, чтобы начать их:

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); 
     } 
    } 
} 

Когда я запускаю этот код, я получаю отличный запуск без ошибок и исключений во время выполнения. Если я покрою операторы System.out.println, я вижу, что каждая строка кода выполняется безупречно. Единственная проблема заключается в том, что, как только программа будет запущена, не будет напечатано сообщение «Job!», указывающее, что начинается работа по опросу.

Я пробовал каждую комбинацию start() и shutdown() Я могу думать о безрезультатно. Могут ли какие-либо кварцевые мавены взглянуть на этот код и рассказать мне, почему работа не стреляет?

В журналах (я настроил log4j) Я вижу рабочий рабочий стол Quartz для запланированного задания. Я чувствую, что нахожусь на 99%, но я просто не вижу ничего очевидного. Заранее спасибо!

+3

Это не справедливо, я дал правильный ответ первым. как вы можете присудить награду за ответ, который предоставляется после того, как щедрота закрыта. unethical – mtariq

ответ

0

ее ваших конструкторов - JobBuilder ищет не-арг и так как они не определены отказывается строить рабочие места. Добавьте пустые no-arg ctors, и вы все настроены.

+0

человек ... @mtariq ответил первым. –

3

По-видимому, вы не запустили спусковой крючок. См Quartz Tutorial или 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

Это все еще не работает ... Любые другие идеи? +1 за помощь в любом случае! – IAmYourFaja

+0

@ 4herpsand7derpsago Делитесь своим последним кодом, пожалуйста, – Andy

0

Не могли бы вы попытаться изменить код метода getDefaultTrigger в классе PollingJob в следующем:

protected final Trigger getDefaultTrigger() { 

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

я чувствую некоторые проблемы с тем, как вы создаете триггер. Помните, что вы не можете повторно использовать триггер для нескольких рабочих мест

Попробуйте создать триггер с уникальным идентификатором и группы, как показано ниже

Trigger everyHourTrigger = newTrigger(). WithIdentity ("everyWeeklyTrigger", "group1") .startNow(). withSchedule (cronSchedule ("0 1 * * *?")).построить();

10

@ 4herpsand7derpsago да вы правы, вы 99% там, я побежал ваш код и есть только одна проблема в этом, то по умолчанию конструкторы отсутствуют в HttpPollingJob и PollingJob классов, по этой причине планировщик не может создать их экземпляры,

Простое решение добавить следующий код в классах ниже
HttpPollingJob класс

public HttpPollingJob() { 
} 

PollingJob класс

public PollingJob() { 
} 

Бинго, следующие сообщения будут напечатаны

Job fired!
Job fired!
Job fired!

Если вы хотите повторить триггер, добавьте следующий код в PollingJob

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

    return triggerBuilder.build(); 
} 

Надеясь, что теперь я буду получать Баунти :)

БОНУС
Похоже, вы хотите опрашивать или сделать что-то с URLs, Лучший способ передать, что с помощью короля JobDataMap

Обновлено 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); 
    } 
} 
} 

обновленный 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()); 
    } 
} 
} 

новый выход

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 вы проверили мой ответ? – mtariq

Смежные вопросы