2013-12-06 3 views
1

Я хочу запустить работу каждые 14 минут.Кварцевое выражение cron для запуска работы каждые 14 минут

Например, если я планирую работу в 11:04 утра, используя выражение 0 0/14 * * * ? cron. , тогда ожидаемое время огня должно быть 11: 18,11: 32,11: 46 и так далее. , но он срабатывает при 11: 00, 11: 14: 11,28: 11: 42,11: 56,12: 00, что не ожидается. и почему он выстрелил в 12:00 после 11:56, есть разница только в 4 мин.

  • Как я могу достичь того, что хочу, используя выражение cron?
  • Может ли кто-нибудь объяснить мне такое поведение кварцевого cron?

Заранее спасибо.

ответ

3

Ну, 0/14 дают вам время огня в 00, 14, 28, 42, 56 и снова в 00 минут каждого часа. Таким образом, последний интервал будет не 14, а 4 минуты. То, как работает cron. Вы можете получить равный интервал в минутах только для случаев, когда остаток деления 60 на ваш интервал равен нулю.

1

Вы ошибаетесь. 0/14 означает, что он будет стрелять каждый час, начиная с 0 после 14min. Вот почему он стреляет в 12.00

+0

cron выражение не заботится о текущем времени? если я попрошу начать работу каждые 14 минут в 11:02, тогда она должна уволить первую работу в 11:16 вместо 11:14. – Vipul

+0

@ Vipul перейдите по этой ссылке, чтобы понять поведение cron. Http: //www.nncron.RU/помощь/EN/рабочий/хрон-format.htm –

0

вы должны изменить свое выражение cron в 0 0/14 * 1/1 * ? *

8

ваше выражение хрон должен выглядеть

0 0/14 * 1/1 * ? * 

Отличный сайт, чтобы создать выражение хрон, когда у вас есть сомнения: http://www.cronmaker.com/

это поможет вам создать свое выражение cron и показать вам следующее время свидания вашего cron.

Дополнительные задания: http://www.nncron.ru/help/EN/working/cron-format.htm

1

"0 0/14 * * *?" означает следующее время огня с начала часов на каждые 14 минут, как то, что вы сказали.

1-й '0' означает ВТОРОЙ на 0 (или 12) на часах; и то же самое для второго '0', что означает MINUTE на 0 (или 12) на часах; '/ 14' означает 14 минут в качестве интервала.

Получите SECOND и MINUTE с текущего времени и объедините их с интервалом в выражение cron, затем запустите его. Ниже приведен пример для Java:

public static String getCronExpressionFromNowWithSchedule(int minuteInterval) throws Exception { 
    String cronExpression = ""; 
    Calendar now = Calendar.getInstance(); 
    int year = now.get(Calendar.YEAR); 
    int month = now.get(Calendar.MONTH); // Note: zero based! 
    int day = now.get(Calendar.DAY_OF_MONTH); 
    int hour = now.get(Calendar.HOUR_OF_DAY); 
    int minute = now.get(Calendar.MINUTE); 
    int second = now.get(Calendar.SECOND); 
    int millis = now.get(Calendar.MILLISECOND); 

    if (minuteInterval<=0) cronExpression = (second+1)+" * * * * ?"; 
    else cronExpression = (second+1)+" "+minute+"/"+minuteInterval+" * * * ?"; 

    System.out.println(cronExpression); 
    return cronExpression; 
} 

В следующий раз огонь в следующую секунду от текущего времени на минутном интервале, переданному в этот метод.

Смежные вопросы