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