12

これは非常に簡単なはずですが、ジョブが実行されていません。タスクの execute() メソッドにブレークポイントがありますが、そこにスレッドが到達しません。何が悪いのかわかりません。

仕事

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

}

メインクラス

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

編集: Quartz.property ファイルがないことを発見したため、クォーツのスレッドプールが作成されていない可能性がありました。したがって、ドキュメントで読んだように、StdSchedulerFactory を使用するコードを次のように置き換えました。

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

何だと思う?まだ運がありません。同じ同じ効果。アプリケーションは生き続け、トリガーではなく発火します。

4

1 に答える 1

18

解決策を見つけました。ジョブ (プリンター) を定義するクラスの可視性をpublicに変更すると、Quartz がそれにアクセスして実行できるようになります。

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

}

これは理解できます。なぜなら、a<? extends Job>.class をスケジューラに渡すことだけが可能であり (地獄、なぜ??)、たとえば匿名オブジェクトを渡すことはできないからです。

そうは言っても、Quartz がエラー メッセージを 1 つも表示せずにジョブの起動に黙って失敗する方法には、本当に腹が立ちます。

于 2013-02-19T09:41:58.627 に答える