2016-07-19 4 views
1

Webページを取得する次のサンプルのQuartzジョブがあります。Javaクォーツスケジューラ - 不正な値を返すgetScheduledFireTime

import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.net.HttpURLConnection; 
import java.net.URL; 

import org.quartz.Job; 
import org.quartz.JobExecutionContext; 
import org.quartz.JobExecutionException; 

public class SampleQuartzJob implements Job { 

    public void execute(JobExecutionContext context) throws JobExecutionException { 
     System.out.println(context.getJobDetail().getKey().toString() + " started"); 
     System.out.println("Scheduled fire time: " + context.getScheduledFireTime()); 
     System.out.println("Fire time: " + context.getFireTime()); 

     try { 
      sendGet(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     System.out.println(context.getJobDetail().getKey().toString() + " completed"); 

     System.out.println(); 
    } 

    private void sendGet() throws Exception { 
     String url = "https://www.google.com/search?q=abc"; 

     URL obj = new URL(url); 
     HttpURLConnection con = (HttpURLConnection) obj.openConnection(); 

     BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream())); 
     String inputLine; 
     StringBuffer response = new StringBuffer(); 

     while ((inputLine = in.readLine()) != null) { 
      response.append(inputLine); 
     } 
     in.close(); 
    } 

} 

5つのジョブを作成し、5秒ごとに1回実行するようにスケジュールするメインクラスは次のとおりです。

12:00:00 // for job 1 
12:00:00 // for job 2 
.. 
12:00:00 // for job 5 

12:00:05 // for job 1 
12:00:05 // for job 2 
.. 
12:00:05 // for job 5 
:私は1

org.quartz.threadPool.threadCount = 1

System.out.println("Scheduled fire time: " + context.getScheduledFireTime()); 

がスケジュールされた時間を印刷しなければならないのスレッド数に次のようなものを使用しています

import static org.quartz.JobBuilder.newJob; 

import javax.xml.bind.JAXBException; 

import org.quartz.CronScheduleBuilder; 
import org.quartz.JobDetail; 
import org.quartz.Scheduler; 
import org.quartz.SchedulerException; 
import org.quartz.Trigger; 
import org.quartz.TriggerBuilder; 
import org.quartz.impl.StdSchedulerFactory; 

public class QuartzMainClass { 

    public void init() throws SchedulerException { 
     Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); 
     for (int i = 1; i <= 5; i++) { 
      JobDetail job = newJob(SampleQuartzJob.class).withIdentity("Job " + i).build(); 

      Trigger trigger = TriggerBuilder.newTrigger() 
        .withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?")).build(); 

      scheduler.scheduleJob(job, trigger); 

     } 

     scheduler.start(); 

    } 

    public static void main(String[] args) throws JAXBException, SchedulerException { 
     QuartzMainClass quartzMainClass = new QuartzMainClass(); 
     quartzMainClass.init(); 
    } 
} 

私は時々期待される出力を得ています。しかし時々、印刷されている予定された時間は間違っています。それは数秒で正しい時刻から外れています。私が使用しているコードに何か問題がありますか?

getScheduledFireTime

  • のjavadocので

  • 答えて

    0
    1. ルックは、あなたの仕事はかなりヘビー級で、まだあなたはクォーツのためにのみ1つのスレッドを持つ、5秒ごとに、それぞれを開始するためにそれらの5を予定しています。それはチョークすることができますクォーツ

    +0

    これは単なる例でした。私は仕事の頻度を毎分1回に減らしても同じ問題を抱えています。私が理解する限り、ジョブはキューに入れられるかもしれませんが、getScheduledFireTimeは正しい時刻を返します。 – KB7

    0

    私もこの問題に気付きました。これは、スケジューラが起動する必要のあるジョブの数に圧倒されて失火を開始した場合に発生します。

    私はそれが誤った日付を与える理由が分からないので、それはしないでください。私が見つけた問題は、コンテキストオブジェクトからトリガオブジェクトを取得し、そこから開始日を取得することでした。そのような場合はうまくいきました。

    ctx.getTrigger().getTriggerは、org.quartz.JobExecutionContextパッケージの機能である。そのトリガオブジェクトから開始日を取得し、スケジューラの失火に関係なく、正しい日時を取得します。

    関連する問題