2013-08-06 24 views
7

Tamam işte ben Şimdi problem 'L' için NumberFormatException atıyor CronSequenceGenerator edilir 10:10 AM.My cron ifadesi her ayın son günü çalışacak bir görev zamanlamak içinCronSequenceGenerator için geçici çözüm Ayın son günü?

0 10 10 L * ? 

olduğunu want Bu, Spring'in CronSequenceGenerator'unun bu tür bir ifadeyi desteklemediği anlamına gelir. Bunu başka bir yolla yapmak (geçici çözüm) .Kartz kullanmak istemiyorum veya Bahar bunu yeni sürümlerde destekleyecek.

/** 
    * Schedule a task {@link Task} with a specified cron expression. 
    * @param task {@link Task} 
    * @param cronExpression cron expression to be applied must be a vaild one. 
    * @param taskName 
    * @return 
    */ 
    public String start(Task task, String cronExpression, String taskName) { 
     CronTrigger trigger = new CronTrigger(cronExpression);//line 2 

     CronSequenceGenerator generator = new CronSequenceGenerator(cronExpression, TimeZone.getTimeZone("GMT+5:30")); 
     List<Date> dateList = new ArrayList<>(5); 
     Date currentDate = new Date(); 
     for (int i = 0; i < 5; i++) { 
      currentDate = generator.next(currentDate); 
      dateList.add((currentDate)); 
      System.out.println("Next Exceution times are" + currentDate); 
     } 
     ScheduledFuture sf = tps.schedule(task, trigger); 

     //TODO Save this scheduled future with a specific task name. 
     ContextHolder.schduledFutureMap.put(taskName, sf); 
     return cronExpression; 
    } 

Ve 2. hatta ben cron ifadesini belirtilen geçiren NumberFormatException atar benim zamanlama yöntemi

ardından

edilir:

Exception in thread "main" java.lang.NumberFormatException: For input string: "L" 
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 
    at java.lang.Integer.parseInt(Integer.java:492) 
    at java.lang.Integer.valueOf(Integer.java:582) 
    at org.springframework.scheduling.support.CronSequenceGenerator.getRange(CronSequenceGenerator.java:324) 
    at org.springframework.scheduling.support.CronSequenceGenerator.setNumberHits(CronSequenceGenerator.java:297) 
    at org.springframework.scheduling.support.CronSequenceGenerator.setDays(CronSequenceGenerator.java:275) 
    at org.springframework.scheduling.support.CronSequenceGenerator.setDaysOfMonth(CronSequenceGenerator.java:266) 
    at org.springframework.scheduling.support.CronSequenceGenerator.parse(CronSequenceGenerator.java:239) 
    at org.springframework.scheduling.support.CronSequenceGenerator.<init>(CronSequenceGenerator.java:81) 
    at org.springframework.scheduling.support.CronTrigger.<init>(CronTrigger.java:54) 
    at org.springframework.scheduling.support.CronTrigger.<init>(CronTrigger.java:44) 
    at com.hcdc.coedp.datantar.scheduler.SchedulerUtil.start(SchedulerUtil.java:75) 
    at com.hcdc.coedp.datantar.scheduler.SchedulerUtil.changeTrigger(SchedulerUtil.java:106) 
    at com.hcdc.coedp.datantar.scheduler.SchedulingService.scheduleTransfer(SchedulingService.java:70) 
    at com.hcdc.coedp.datantar.scheduler.Scheduler.schedule(Scheduler.java:107) 
    at main.Main.main(Main.java:47) 

Güncelleme: İşte

tam StackTrace olduğunu.

+0

Ben biraz etrafına baktı ve L aslında desteklendiği anlaşılıyor. İşi nasıl tanımlıyorsunuz? Ek Açıklama? Bunu muhtemelen sorunuza eklemelisiniz. – Magnilex

+0

@Magnilex check güncelleme –

+0

Harika. "Start()" yöntemini çağıran ilgili kodu da yapıştırabilir misiniz? Bunun için üzgünüm, ama gerçekten kullanmam gerektiğini düşünüyorum. – Magnilex

cevap

6

planlanan yöntemde gerçek tarih kontrol etti. Yani muhtemelen Bahar bunu asla uygulayamaz. code baktığımızda, CronSequenceGenerator uzanan cerrahi çözüm göremiyorum. Peki neden sadece particular feature'dan beri Quartz kullanmıyorsun?

Tam ihtiyacınıza bağlı olarak, kendi Trigger'nu uygulayabilirsiniz. sadece ayın son gününde çalışan

import java.util.Date; 

import org.joda.time.LocalDate; 
import org.joda.time.LocalTime; 
import org.springframework.scheduling.Trigger; 
import org.springframework.scheduling.TriggerContext; 

public class LastDayOfMonthTrigger implements Trigger { 

    private final LocalTime time; 

    public LastDayOfMonthTrigger(LocalTime time) { 
     this.time = time; 
    } 

    @Override 
    public Date nextExecutionTime(TriggerContext ctx) { 
     Date last = ctx.lastScheduledExecutionTime(); 
     LocalDate date = last == null ? new LocalDate() : new LocalDate(last).plusDays(1); 
     LocalDate lastDay = date.dayOfMonth().withMaximumValue(); 
     return lastDay.toDateTime(time).toDate(); 
    } 
} 
+0

Teşekkürler, Ve ben kuvars kullanamadım çünkü mimarlık düzeyinde refactoring istiyor ... "Beni öldürecekler" .... Ve ben de CustomTrigger fikri Çalışılacak gibi görünüyor ... –

5

Çözüm olarak ben tüm tarihler

0 10 10 * * ? 

için yürütme planlamak istiyorum ve bu özellik standard cron expression syntax değil

public void scheduledTask() { 
    Calendar c = Calendar.getInstance(); 
    if (c.get(Calendar.DATE) == c.getActualMaximum(Calendar.DATE)) { 
     ... 
    } 
} 
+2

Çalışırdı, ancak yalnızca ayın son günlerine ait yöntemi, 27-31. Gün gibi bir şeyi planlayacağım. – Magnilex

+0

Evet, bazı optimizasyonlar olacağını düşünüyorum. –

+0

Teşekkürler ... Ama sadece ayın son günü çalışacak. –

2

Optimize sürümü: Böyle bir şey

@Scheduled(cron = "0 55 23 28-31 * ?") 
public void doStuffOnLastDayOfMonth() { 
    final Calendar c = Calendar.getInstance(); 
    if (c.get(Calendar.DATE) == c.getActualMaximum(Calendar.DATE)) { 
     // do your stuff 
    } 
} 
İlgili konular