4

周一到周六晚上 7 点到早上 9 点执行工作,周日全天执行。

我尝试输入多个 cron 表达式,但它不起作用。谁能帮我解决这个问题?

1. " * * 19-8 ? * MON,TUE,WED,THU,FRI,SAT "
2. " * * * ? * SUN "
4

5 回答 5

5

由于您使用的是Quartz,因此您可以创建几个不同的 CronTriggers,并将它们全部安排到您需要的工作中。例如(将 cron 表达式更改为您需要的表达式)

SchedulerFactory sf = new StdSchedulerFactory();
Scheduler sched = sf.getScheduler();

JobDetail job = newJob(SimpleJob.class)
    .withIdentity("job1", "group1")
    .build();

Set<Trigger> triggers = new HashSet<>();

CronTrigger trigger = newTrigger()
    .withIdentity("trigger1", "group1")
    .withSchedule(cronSchedule("0/20 * * * * ?"))
    .build();
triggers.add(trigger1);

CronTrigger trigger2 = newTrigger()
    .withIdentity("trigger2", "group1")
    .withSchedule(cronSchedule("15 0/2 * * * ?"))
    .build();
triggers.add(trigger2);

CronTrigger trigger3 = newTrigger()
    .withIdentity("trigger3", "group1")
    .withSchedule(cronSchedule("0 0/2 8-17 * * ?"))
    .build();
triggers.add(trigger3);

scheduler.scheduleJob(job, triggers, false);

您不能使用多个 CronExpressions 创建一个触发器。

于 2014-10-07T13:16:56.540 回答
0

我认为看到您的要求的复杂性,我们需要创建 4 cron 表达式来完成您的任务。

// 周一晚上 7 点到 12 点的任务

==>

 * 19-24 * * 1  <YOUR_TASK>
    ->* – every Minute 
    ->19-24 hours
    ->* – Every day
    ->* – Every month
    ->1--Mon,

//周二到周五的任务 ==>

* 00-24 * * 2-5  <YOUR_TASK>
->* – 0th Minute 
-> 00-24 hours
->* – Every day
->* – Every month
->1-5 -Mon, Tue, Wed, Thu , Fri, Sat

//周六上午 9 点之前的任务 ==>

* 00-09 * * 6  <YOUR_TASK>
->00 – every Minute 
->00-09 – upto 9 AM
->* – Every day
->* – Every month
->6 -, Sat

//周六的任务==>

 * * * * 7   <YOUR_TASK>
    ->* – Every minute  
    ->00-09 – upto 9 AM
    ->* – Every day
    ->* – Every month
    ->6 -, Sat
于 2013-04-19T18:17:49.173 回答
0

CronMaker是一个实用程序,可帮助您构建 cron 表达式。CronMaker 使用Quartz开源调度器。生成的表达式基于 Quartz cron 格式。

此表达式定义任务的开始。它没有定义它的持续时间(它属于任务)。

-用于指定范围。例如,小时字段中的“10-12”表示“10、11 和 12 小时”

CronTrigger 教程

于 2013-04-19T18:26:22.143 回答
0

cron-utils引入了多 cron 表示法:您可以将多个 cron 组合成一个表达式。下面是一个例子:

String multicron = "0 0|0|30|0 9|10|11|12 * * ? *";
parser = new CronParser(CronDefinitionBuilder.instanceDefinitionFor(CronType.QUARTZ));
Cron cron = parser.parse(multicron);
assertEquals(multicron, cron.asString());

cron 表示法与任何常规 cron 相同:在 cron 中保持相同值的字段保持不变。将包含不同值的字段将由管道分隔。

您的两个 crons 可以表示为:

"* * 19-8|* ? * MON,TUE,WED,THU,FRI,SAT|SUN"

目前 cron-utils 不支持作业执行,但提供了知道下一个/上一个执行日期的方法。

于 2018-03-24T04:53:47.537 回答
0

如果需要 nodejs,https://github.com/datasert/cronjs会执行多 cron 表达式。例如,* 21-23 * * 2,4,6|* 0-5 * * 1,3,5|* * ? * 7

免责声明 我是构建该库的团队的一员

于 2021-08-29T03:52:22.293 回答