使用Quartz.net Server版本2.1.2,由于缺乏对UTC时区偏移的支持,我从版本2.0升级到版本。在我们指定的时间没有发送作业,这似乎是因为时区偏移。
我有三种工作类型:
工作频率要求
对于所有这三个,我使用 SimpleTriggers 的Cron表达式。
我的问题是: 为了验证我正在安排的作业以及将在服务器上运行的作业将在其时区中按时运行,我需要注意哪些事项?
似乎只是指定时区是不够的;我像这样指定时区
dailyTrigger.TimeZone = BrainTimeZone;
但是在持有石英实例的服务器(在PST中)在纽约(美国东部标准时间)下午2:00获得一份工作,“下一次运行时间”应该是下午2:00,但它会在中午显示并运行。
以下是一些关于Quartz Time Zones的优秀s / o文章:
Quartz.net UTC资源:
以下是我目前每日安排的方式:
private void CreateDaily()
{
var expression = CronScheduleBuilder
.DailyAtHourAndMinute(GetNormalizedHour(), Minute)
.InTimeZone(TimeZone)
.Build() as CronTriggerImpl;
IJobExecutionContext jobContext = GetJobContext();
IJobDetail job = JobBuilder.Create<MailJob>()
.WithIdentity(JobName, GroupName)
.UsingJobData(jobContext.JobDetail.JobDataMap)
.Build();
ScheduleBuilder<>cronExpressionString
var cronExpressionString = expression.CronExpressionString; // returns a cron expr.
var dailyTrigger = (ICronTrigger)TriggerBuilder.Create()
.WithIdentity(JobName, GroupName)
.WithSchedule(cronExpressionString)
.Build();
dailyTrigger.TimeZone = BrainTimeZone;
this.JobTrigger = dailyTrigger;
this.JobDetail = job;
this.Success = true;
}
我尝试使用DailyTimeIntervalTriggerImpl,但这似乎不是上述3种间隔类型中的任何一种的正确触发器。
private void DailyJob()
{
#region Duration
var daysOfWeek = new Quartz.Collection.HashSet<System.DayOfWeek>
{
System.DayOfWeek.Monday,
System.DayOfWeek.Tuesday,
System.DayOfWeek.Wednesday,
System.DayOfWeek.Thursday,
System.DayOfWeek.Friday,
System.DayOfWeek.Saturday,
System.DayOfWeek.Sunday,
};
DateTimeOffset startTime = DateTime.Now;
DateTimeOffset endTime = DateTime.Now.AddYears(1);
TimeOfDay startTimeOfDay = TimeOfDay.HourMinuteAndSecondOfDay(Hour, Minute, 0);
TimeOfDay endTimeOfDay = TimeOfDay.HourMinuteAndSecondOfDay(Hour, Minute, 30);
#endregion
IJobExecutionContext jobContext = GetJobContext();
if (JobName == null || GroupName == null) {
this.Success = false;
return;
}
var dailyTrigger = new DailyTimeIntervalTriggerImpl
{
StartTimeUtc = startTime.ToUniversalTime(),
EndTimeUtc = endTime.ToUniversalTime(),
StartTimeOfDay = startTimeOfDay,
EndTimeOfDay = endTimeOfDay,
RepeatIntervalUnit = IntervalUnit.Week,
DaysOfWeek = daysOfWeek,
// RepeatInterval = 1,
TimeZone = TimeZone,
Key = new TriggerKey(JobName, GroupName),
};
// Compute fire times just to show simulated fire times
IList<DateTimeOffset> fireTimes = TriggerUtils.ComputeFireTimes(dailyTrigger, null, 1000);
foreach (var dateTimeOffset in fireTimes)
{
QuartzLog("Daily trigger has been computed - fireTimes as follows:\r\n\r\n");
QuartzLog(string.Format("utc:{0} - adjusted time:{1} - timezone:{2}", dateTimeOffset,
TimeZoneInfo.ConvertTimeFromUtc(dateTimeOffset.DateTime, BrainTimeZone), BrainTimeZone.DisplayName));
}
我正在重构所有石英图层,因此我正在寻找最佳实践和防弹方法,以确保作业将在我们指定的时间运行,无论Quartz.net作业服务器位于何处,以及用户的时区源自何处以及他们希望最终到达的位置。
我们正在将quartz.net服务器迁移到AWS,因此我们将拥有一个分布式服务器场来托管这些服务器场,并使用可以更改的时区。
如何设置我的石英架构,使其足够动态,如上所述,防弹,按时发送作业 - 无论TimeZones / Offsets / DaylightSavings / LeapYear / Sleat / Snow / Rain / Zombie Attacks / Y2K / Meteoric ELE /等?
谢谢。