2013-02-13 8 views
7

Dies sollte ziemlich einfach sein, aber ich sehe keine Arbeit ausgeführt wird. Ich habe einen Breakpoint auf der execute() -Methode der Aufgabe, kein Thread wird jemals dort. Ich verstehe nicht, was los ist.Quarz nicht feuern einfacher Auslöser

der Job

class Printer implements Job{ 
    public Printer(){ 
     System.out.println("created printer"); 
    } 

    @Override 
    public void execute(JobExecutionContext context) 
      throws JobExecutionException { 
     System.out.println("hi" + context.getFireTime()); 
    } 

} 

Die Hauptklasse

class MyClass { 
     public static void main(String[] args) throws Throwable { 
      Scheduler s = StdSchedulerFactory.getDefaultScheduler(); 
      JobDetail job = newJob(Printer.class).build(); 
      CronTrigger trigger = 
        newTrigger() 
        .withIdentity("a", "t") 
        .withSchedule(cronSchedule("0/5 * * * * ?").inTimeZone(TimeZone.getDefault())) 
        .forJob(job).build(); 
      s.scheduleJob(job, trigger); 

// This prints the right date! 

      System.out.println(trigger.getNextFireTime()); 
      s.start(); 
     } 
} 

EDIT: Ich entdeckte ich nicht die quartz.property Datei hatte, so gab es die Möglichkeit der Threadpool für Quarz war nicht erstellt. Deshalb, wie in documentation lesen, ersetzte ich den Code mit StdSchedulerFactory mit dem folgenden:

DirectSchedulerFactory.getInstance().createVolatileScheduler(10); 
Scheduler s = DirectSchedulerFactory.getInstance().getScheduler(); 

was Guess? Kein Glück noch. Gleicher identischer Effekt. Anwendung bleibt am Leben, feuern nicht auslösen.

+1

Beendet Ihr Programm nicht gerade? – Dariusz

+0

Nein, weil ich den Scheduler nicht herunterfahre (in Zweck). – sscarduzio

+0

Haben Sie tatsächlich bestätigt, dass Ihre Bewerbung nicht einfach nach 's.start()' endet? – Dariusz

Antwort

9

Ich fand die Lösung: Ändern der Sichtbarkeit der Klasse, die den Job (Drucker) zu öffentlichen definieren, wird es möglich, dass Quartz darauf zugreifen und es ausführen.

public class Printer implements Job{ // just add 'public'! 
    public Printer(){ 
     System.out.println("created printer"); 
    } 

    @Override 
    public void execute(JobExecutionContext context) 
      throws JobExecutionException { 
     System.out.println("hi" + context.getFireTime()); 
    } 

} 

, die verständlich ist, da es nur möglich ist, ein <? extends Job>.class an den Scheduler übergibt (Teufel, warum ??) und nicht - zum Beispiel - anonyme Objekte.

Mit diesem gesagt, finde ich wirklich ärgerlich die Art und Weise Quarz schweigt fehlschlägt, Aufträge ohne eine einzige Fehlermeldung zu feuern.

+3

Ein anderes Problem kann sein, wenn der Contractor Parameter benötigt oder nicht öffentlich ist. Ich habe mein Problem dank dir gefunden. –

+2

Ich hatte das gleiche Problem. Ich finde es auch sehr merkwürdig/frustrierend, dass überhaupt keine Fehlermeldungen ausgegeben werden ... –