2016-07-19 10 views
1

다음 샘플 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

  • 귀하의 작업의 자바 독에서

  • 답변

    0
    1. 봐 꽤 헤비급 아직 당신은 석영 만 1 스레드를 가지고, 5 초마다 각을 시작하도록 5 일정을 가지고있다. 그것은 질식 할 수있다 석영

    +0

    예일뿐입니다. 나는 작업의 빈도를 1 분에 한 번 줄이면 같은 문제가 발생합니다. 내가 아는 한, 작업은 대기열에 올라있을 수 있지만 getScheduledFireTime은 올바른 시간을 반환해야합니다. – KB7

    0

    나는이 문제점을 또한주의했다. 이것은 당신의 스케줄러가 발사해야하는 작업의 수에 압도 당해서 실화가 시작될 때 발생합니다.

    내가 잘못된 날짜를주는 이유를 모르겠다. 내가 찾은 해결 방법은 컨텍스트 개체에서 트리거 개체를 가져 와서 시작 날짜를 가져 오는 것입니다. 그런 경우에는 제대로 작동합니다.

    ctx.getTrigger().getTriggerorg.quartz.JobExecutionContext 패키지의 기능입니다. 해당 트리거 개체에서 시작 날짜 가져 오기 및 스케줄러 misfiring 여부에 관계없이 올바른 datetime 얻을 것이다.

    관련 문제