다음 샘플 Quartz 작업을 통해 웹 페이지를 가져옵니다.Java Quartz Scheduler - 잘못된 값을 반환하는 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 초마다 한 번 실행하도록 예약하는 기본 클래스는 다음과 같습니다.
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();
}
}
나는 1
의 스레드 수를 사용하고 org.quartz.threadPool.threadCount = 1
System.out.println("Scheduled fire time: " + context.getScheduledFireTime());
다음과 같은 예약 된 시간에 뭔가를 인쇄해야합니다
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
을
때때로 예상되는 출력을 얻고 있습니다. 그러나 때로는 인쇄 예정된 일정 시간이 잘못되었습니다. 정확한 시간이 몇 초 남았습니다. 내가 사용하고있는 코드에 문제가 있습니까?
getScheduledFireTime
귀하의 작업의 자바 독에서
예일뿐입니다. 나는 작업의 빈도를 1 분에 한 번 줄이면 같은 문제가 발생합니다. 내가 아는 한, 작업은 대기열에 올라있을 수 있지만 getScheduledFireTime은 올바른 시간을 반환해야합니다. – KB7