2011-05-26 91 views
0

有没有什么办法可以在特定的日期之后设置crontrigger的开始,也就是crontrigger会在使用cron表达式的特定日期之后触发。我尝试使用crontrigger starttime和firstfire time但是没有工作。可以用另一个触发器做到这一点,但我认为应该有另一种方式。石英cron触发器第一次着火时间

这是cron表达式

0 0/5 * * * ? 

即在分钟(5,10,15,... 00)不现在+ 5

这是日志程序写入

触发器应开始于周五5月27日21时03分31秒EEST 2011 //我希望它在这个时间

Job start at Fri May 27 20:55:00 EEST 2011   //it ignore start time 
Job start at Fri May 27 21:00:00 EEST 2011 
Job start at Fri May 27 21:05:00 EEST 2011 

运行
public CronTrigger scheduleJob(RemoteJob job, String cronExpression,Date firstFireTime) throws SchedulerException, ParseException { 
    JobDetail jobDetail = new JobDetail(job.getDescription(), job.getName(), job.getClass()); 
    CronTrigger crTrigger = new CronTrigger(
      "cronTrigger", job.getName(), cronExpression);  
    scheduler.scheduleJob(jobDetail, crTrigger);  

    try{ 
     Calendar c=Calendar.getInstance(); 
     c.add(Calendar.MINUTE, 10); 
     firstFireTime=c.getTime(); 
     FileWriter writer=new FileWriter("/opt/scheduler.cron",true); 
     writer.write("Trigger should start at " +c.getTime().toString()+"\n\n"); 
     writer.close(); 
    }catch(Exception e){ 

    } 
    crTrigger.setStartTime(firstFireTime); 
    crTrigger.setMisfireInstruction(CronTrigger.MISFIRE_INSTRUCTION_DO_NOTHING); 

    return crTrigger; 

} 

这是通过触发器执行的作业。

public class ExternalJob extends RemoteJob { 

    private static final Logger _logger = Logger.getLogger(ExternalJob.class.getName()); 
    private static ExternalStorageProcessor processor = new ExternalStorageProcessor(); 
    private ExternalTask task; 
    private static final String tempPath = "/opt/itaptemp/"; 
    private String name; 
    private String description; 
    private static final long MARK=1L; 

    public ExternalJob(String name, String description) { 



    public void execute(JobExecutionContext context) throws JobExecutionException { 


     try{ 
      Calendar c=Calendar.getInstance();   

      FileWriter writer=new FileWriter("/opt/scheduler.cron",true); 
      writer.write("Job start at " +c.getTime().toString()+"\n"); 
      writer.close(); 
     }catch(Exception e){ 

     } 

回答

1

将startTime属性设置为将来希望计划(表达式)开始应用的日期。

我看到你说你试过了,它没有工作,但它肯定应该,所以请再试一次。

CronTrigger ct = new CronTrigger("foo", "goo", "0 0/10 * * * ?"); // fire every ten minutes, all day every day 

    // construct a date of March 17, 2012 10:03:00 
    Calendar futureDate = Calendar.getInstance(); 
    futureDate.set(Calendar.YEAR, 2012); 
    futureDate.set(Calendar.MONTH, GregorianCalendar.MARCH); 
    futureDate.set(Calendar.DAY_OF_MONTH, 17); 
    futureDate.set(Calendar.HOUR_OF_DAY, 10); 
    futureDate.set(Calendar.MINUTE, 3); 
    futureDate.set(Calendar.SECOND, 0); 
    futureDate.set(Calendar.MILLISECOND, 0); 

    // use the date as the startTime 
    ct.setStartTime(futureDate.getTime()); 

    // check what time the trigger will first fire 
    List fireTimes = TriggerUtils.computeFireTimes(ct, null, 1); 
    Date firstFireTime = (Date) fireTimes.iterator().next(); 

    System.out.println("First fire time: " + firstFireTime); 

这导致:

第一把火时间:周六3月17日10:10:00 MDT 2012

+0

你确定这是cron的触发 – ayengin 2011-05-27 18:08:40

+0

绝对的情况下(除非有报道以前从未错误)。 – jhouse 2011-05-27 20:27:35

+0

我添加了我的调试信息和代码.Cron触发器忽略了启动时间。 – ayengin 2011-05-29 16:42:57

2

的问题是,您使用的一个触发每一个cron甚至分钟开始0分钟( 0/5 * * *?)。

您应该将开始日期设置为偶数分钟。因此,你可以使用DateBuilder.EvenMinuteDateBefore(StartTime).

所以,如果你是STARTIME ... Fri May 27 20:55:31 ...方法DateBuilder.EvenMinuteDateBefore(StartTime)将其转换为... Fri May 27 20:55:00

那么你的时间表将是这样的:

Job start at Fri May 27 20:55:00 EEST 2011 
Job start at Fri May 27 21:00:00 EEST 2011 
Job start at Fri May 27 21:05:00 EEST 2011