Cron 在我的quartz.net作业调度器中检查时区有趣性的内容
使用Quartz.net服务器版本2.1.2,由于不支持UTC时区偏移,我将其从版本2.0升级到版本2.1.2。作业没有在我们指定的时间发送,这似乎是因为时区偏移 我有三种工作类型: 工作频率要求Cron 在我的quartz.net作业调度器中检查时区有趣性的内容,cron,quartz-scheduler,quartz.net,quartz.net-2.0,Cron,Quartz Scheduler,Quartz.net,Quartz.net 2.0,使用Quartz.net服务器版本2.1.2,由于不支持UTC时区偏移,我将其从版本2.0升级到版本2.1.2。作业没有在我们指定的时间发送,这似乎是因为时区偏移 我有三种工作类型: 工作频率要求 每日(在给定时间每天一次) 每周(在一到N天内,在给定时间每天一次) 每月(一至n天,每天一次或最后一天) 对于这三种情况,我都将Cron表达式与simpletrigger一起使用 我的问题是: 我需要勾选哪些内容来验证我正在调度的作业以及将在服务器上运行的作业是否在其时区内按时运行 仅仅指定时区似乎
dailyTrigger.TimeZone = BrainTimeZone;
但是,在保存quartz实例(在PST中)的服务器上,在纽约(EST)获得计划在下午2:00的作业,“下一次运行时间”应该是下午2:00,但它在中午显示并运行
以下是一些关于石英时区的优秀s/o文章:
Quartz.net UTC资源:
private void CreateDaily()
{
变量表达式=CronScheduleBuilder
.DailyaThourAdminute(GetNormalizedHour(),分钟)
.InTimeZone(时区)
.Build()作为CronTriggerImpl;
iJobeExecutionContext jobContext=GetJobContext();
IJobDetail job=JobBuilder.Create()
.WithIdentity(作业名、组名)
.UsingJobData(jobContext.JobDetail.JobDataMap)
.Build();
ScheduleBuilderCron表达式字符串
var cronExpressionString=expression.cronExpressionString;//返回一个cron expr。
var dailyTrigger=(icontrigger)TriggerBuilder.Create()
.WithIdentity(作业名、组名)
.WithSchedule(cronExpressionString)
.Build();
dailyTrigger.TimeZone=大脑时区;
this.JobTrigger=dailyTrigger;
this.JobDetail=作业;
这就是成功;
}
我尝试使用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));
}
private void DailyJob()
{
#区域持续时间
var daysOfWeek=new Quartz.Collection.HashSet
{
System.DayOfWeek.周一,
System.DayOfWeek.周二,
System.DayOfWeek.周三,
System.DayOfWeek.周四,
System.DayOfWeek.周五,
System.DayOfWeek.周六,
System.DayOfWeek.Sunday,
};
DateTimeOffset startTime=DateTime.Now;
DateTimeOffset endTime=DateTime.Now.AddYears(1);
TimeOfDay startTimeOfDay=TimeOfDay.HourMinuteAndSecondOfDay(小时,分钟,0);
TimeOfDay endTimeOfDay=TimeOfDay.HourMinuteAndSecondOfDay(小时,分钟,30);
#端区
iJobeExecutionContext jobContext=GetJobContext();
if(JobName==null | | GroupName==null){
成功=错误;
返回;
}
var dailyTrigger=新的DailyTimeIntervalTriggerImpl
{
StartTimeUtc=startTime.ToUniversalTime(),
EndTimeUtc=endTime.ToUniversalTime(),
StartTimeOfDay=StartTimeOfDay,
EndTimeOfDay=EndTimeOfDay,
RepeatIntervalUnit=IntervalUnit.周,
DaysOfWeek=DaysOfWeek,
//重复间隔=1,
时区=时区,
Key=新的触发器Key(JobName,GroupName),
};
//计算火灾时间只是为了显示模拟火灾时间
IList fireTimes=TriggerUtils.ComputeFireTimes(dailyTrigger,null,1000);
foreach(fireTimes中的var dateTimeOffset)
{
QuartzLog(“已计算每日触发器-火灾时间如下:\r\n\r\n”);
QuartzLog(string.Format(“utc:{0}-调整后的时间:{1}-时区:{2}”),dateTimeOffset,
TimeZoneInfo.ConvertTimeFromUtc(dateTimeOffset.DateTime,BrainTimeZone),BrainTimeZone.DisplayName);
}
我正在重构我所有的quartz层,因此我正在寻找最佳实践和一种防弹方法,以确保作业将在我们指定的时间运行,而不管quartz.net作业服务器位于何处,用户的时区来自何处以及他们希望它到达何处
我们正在将quartz.net服务器迁移到AWS,因此我们将有一个分布式服务器场来承载这些服务器,其时区可以更改
我如何设置我的quartz架构,使其具有足够的动态性,并且如我前面所述,防弹,按时发送工作-无论时区/偏移量/日光节约/闰年/Sleat/雪/雨/僵尸攻击/Y2K/流星元素/等等
多谢各位
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));
}