Java Quartz调度程序-GetScheduledFitime返回不正确的值
我有以下示例Quartz作业,用于检索网页Java Quartz调度程序-GetScheduledFitime返回不正确的值,java,quartz-scheduler,Java,Quartz Scheduler,我有以下示例Quartz作业,用于检索网页 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; pu
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();
}
}
应打印与以下类似的计划时间:
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
我有时会得到预期的输出。但有时,打印的ScheduledTime是不正确的。它与正确的时间相差几秒钟。我使用的代码是否有问题
我也注意到了这个问题。如果您的计划程序被需要启动的作业数量压得喘不过气来,并且开始无法启动,则会发生这种情况 我不知道为什么它给出了不正确的日期。我发现的解决方法是从上下文对象获取触发器对象,并从中获取开始日期。在这种情况下,这种方法很有效
ctx.getTrigger()
其中.getTrigger
是org.quartz.JobExecutionContext包的函数。从该触发器对象获取开始日期,无论调度程序是否缺火,您都将获得正确的日期时间。这只是一个示例。即使我将工作频率降低到每分钟一次,我也有同样的问题。据我所知,作业可能会排队,但GetScheduledFitime仍应返回正确的时间。
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