Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Quartz调度程序-GetScheduledFitime返回不正确的值_Java_Quartz Scheduler - Fatal编程技术网

Java Quartz调度程序-GetScheduledFitime返回不正确的值

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

我有以下示例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;

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是不正确的。它与正确的时间相差几秒钟。我使用的代码是否有问题

  • 看看javadoc

    GetScheduledFitime

  • 你的工作相当繁重,但你有5个计划每5秒启动一次,石英只有1个线程。它会阻塞石英


  • 我也注意到了这个问题。如果您的计划程序被需要启动的作业数量压得喘不过气来,并且开始无法启动,则会发生这种情况

    我不知道为什么它给出了不正确的日期。我发现的解决方法是从上下文对象获取触发器对象,并从中获取开始日期。在这种情况下,这种方法很有效


    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