2013-11-05 4 views
3

Я ищу библиотеку выражений cron в java. Что-то, что может анализировать выражения cron и возвращать мне будущее время срабатывания триггера.cron library for java

API на линиях.

CronExpression cronExpression = new CronExpression("0 30 4 * * *"); 
    List<Date> fireTimes = cronExpression.getFireTimes(todaysDate, nextWeekDate); 

Я не хочу использовать что-то сложное, как кварц. Цель состоит в том, чтобы в основном использовать cron, как регулярное выражение для таймингов. Это все. Мне не нужен фоновый планировщик.

Я пробовал поиск в Интернете, но не смог найти ничего очень полезного. Мы ценим любые предложения.

С уважением, Pulkit

P.S - Я посмотрел на использование класса CronExpression из кварца. Было не очень полезно - провалив некоторые тесты.

+0

Не могли бы вы опубликовать тестовый случай, что не удалось на CronExpression? Это ограничение или ошибка? Это было бы полезно для всех. – Ahamed

+0

@Ahamed - используя класс кварца не работал. посмотрите на мой ответ ниже, как это работает в конечном итоге. – nutsiepully

ответ

1

Вы можете использовать cron4j для cron expessions и scheduling.

также вы можете найти этот пост из chirag интересных,

cronTrigger.getExpressionSummary() 
Example: 

    CronTrigger t = new CronTrigger(); 
    t.setCronExpression("0 30 10-13 ? * WED,FRI"); 
    System.out.println(""+t.getExpressionSummary()); 
Output: 

seconds: 0 
minutes: 30 
hours: 10,11,12,13 
daysOfMonth: ? 
months: * 
daysOfWeek: 4,6 
lastdayOfWeek: false 
nearestWeekday: false 
NthDayOfWeek: 0 
lastdayOfMonth: false 
years: * 
+0

спасибо за ваш ответ. Я знаю, но я не хочу назначать рабочие места. Я просто хочу знать, каковы были бы тайминги для данного выражения cron. – nutsiepully

+0

Обратитесь к обновленному сообщению. –

1

Я был в состоянии решить эту проблему с помощью фиктивных триггеров на кварце. Я не планировал и заданий и т. Д., Просто использовал триггер api, чтобы вычислить все действия, которые должно выполняться на основе выражения cron.

Бест, Pulkit

OperableTrigger trigger = (OperableTrigger)TriggerBuilder 
      .newTrigger() 
      .withIdentity("trigger1", "group1") 
      .withSchedule(
        SimpleScheduleBuilder.simpleSchedule() 
          .withIntervalInSeconds(5).repeatForever() 
      ) 
      .build(); 

    Date startDate = new Date(); Date endDate = new Date(startDate.getTime() + 1000000); 
    List<Date> dateList = TriggerUtils.computeFireTimesBetween(trigger, new BaseCalendar(), startDate, endDate); 

    System.out.println("******Times**********"); 
    for(Date date : dateList) { 
     System.out.println(date.toString()); 
    } 
    System.out.println("*********************"); 
0

cron-utils Похоже, может быть полезным для вас. Это не планировщик. Предоставляет методы обработки определения cron и возврата последнего/следующего выполнения с учетом DateTime.

Вот отрывок из документации:

CronDefinition cronDefinition = CronDefinitionBuilder.instanceDefinitionFor(QUARTZ); 
CronParser parser = new CronParser(cronDefinition); 

//Get date for last execution 
DateTime now = DateTime.now(); 
ExecutionTime executionTime = ExecutionTime.forCron(parser.parse("* * * * * * *")); 
DateTime lastExecution = executionTime.lastExecution(now)); 

//Get date for next execution 
DateTime nextExecution = executionTime.nextExecution(now)); 

//Time from last execution 
Duration timeFromLastExecution = executionTime.timeFromLastExecution(now); 

//Time to next execution 
Duration timeToNextExecution = executionTime.timeToNextExecution(now); 
0

В случае, если это полезно для других тоже, я попробовал другие варианты, но не был удовлетворен ни и в конечном итоге писать свою собственную очень небольшую библиотеку только для это цель, crony. Он доступен на maven-central.

Код, который вы хотели бы, с ставленника:

Cron cronExpression = Cron.parseCronString("0 30 4 * * *").get(); 
Stream<ZonedDateTime> fireTimes = CronExecution 
    .getNextExecutionDates(cron, todaysDate) 
    .takeUntil(d -> d.isAfter(nextWeekDate));