Luk*_*uke 5 c# scheduling quartz.net
我试图在Quartz.NET中每3个月(每季度)调用一次(使用稳定版和最新版本2,测试结果相同).
我创建了cron触发器,0 30 8 3 */3 ? *每月3点30分在它发生的第三个月的第三个月被调用.
从技术上来说,从今天的9月2日开始,我预计它将在明天触发.然而,它的下一个运行时间显示为下个月.为什么会这样?
更新:根据我得到的答案,我创建了以下方法 - 可能对某些人有用:
public static string CalculateMonthsWithInterval(int startMonth, int interval)
{
var months = new List<string>();
var monthNames = new [] {"JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"};
var monthSelector = startMonth % interval;
for (var i = 0; i < 12; i++)
{
if (i % interval == monthSelector)
{
months.Add(monthNames[i]);
}
}
return string.Join(",", months.ToArray());
}
Run Code Online (Sandbox Code Playgroud)
Ps:我几个月没有使用索引,因为由于某些原因它与我的Quartz(v2 BETA)不兼容.此外,它在数据库级别更容易阅读.
示例调用 - 基于startDate的每3个月:
var cronMonths = CronUtils.CalculateMonthsWithInterval((startDate.Month - 1), 3);
Run Code Online (Sandbox Code Playgroud)
好吧,我认为这是因为调度程序将验证哪个月可以除以3,因为Quartz中的所有月都是0(根据:http://www.quartz-scheduler.org/documentation/quartz-2.x/tutorials/tutorial-lesson-06),将安排的月份将是1月,4月,7月和10月.
0 mod 3 = 0 -> JAN
1 mod 3 = 1 -> FEB
...
8 mod 3 = 2 -> SEP
9 mod 3 = 0 -> OCT
Run Code Online (Sandbox Code Playgroud)
Quartz调度程序将分析您的cron表达式,并仅保留其模数3等于0的那些表达式.
如果你希望它在1个月之前(3月,6月,9月和10月)你将必须设置为:
0 30 8 3 MAR,JUN,SEP,DEC ? *
创建cron表达式的好页面:http://www.cronmaker.com/
Cron格式:
0 0 12 1 1/3 ? *
Run Code Online (Sandbox Code Playgroud)
执行每一个:
1. Saturday, April 1, 2017 12:00 PM
2. Saturday, July 1, 2017 12:00 PM
3. Sunday, October 1, 2017 12:00 PM
4. Monday, January 1, 2018 12:00 PM
5. Sunday, April 1, 2018 12:00 PM
Run Code Online (Sandbox Code Playgroud)