【问题标题】:Running Quartz.net job which fires 3 times in a row--should only be once运行连续触发 3 次的 Quartz.net 作业——应该只有一次
【发布时间】:2011-03-15 07:24:34
【问题描述】:

我有以下代码来使用 Quartz 安排重启作业。该代码为一周中的每一天设置一个触发器(由用户选择)。因此,该作业应该能够每天最多运行一次。但是,当我对其进行测试时,它会连续运行三次,而不是一次。有什么想法吗?

private void ScheduleJob(Server server)
{
    bool jobScheduled = false;
    JobDetail job = new JobDetail(server.ServerName, JOB_GROUP, typeof(RebootJob));
    job.JobDataMap.Add("Server", server);
    // Create a trigger for each day of the week on which this schedule falls
    for(int i=0; i < 7; i++)
    {
        DayOfWeek dayOfWeek = (DayOfWeek)i;
        DateTime? jobStartTime = server.GetNextScheduledRebootDateAndTime();
        if(server.isScheduledOnDayOfWeek(dayOfWeek) && jobStartTime.HasValue)
        {
            SimpleTrigger trigger = new SimpleTrigger(
                String.Format("{0}.{1}", server.ServerName, dayOfWeek.ToString()),
                JOB_GROUP,
                jobStartTime.Value.ToUniversalTime(),
                null,
                SimpleTrigger.RepeatIndefinitely,
                TimeSpan.FromDays(7 * (double)server.RebootFrequency)
            );
            if(!jobScheduled)
            {
                ManagementService.Instance.Scheduler.ScheduleJob(job, trigger);
                jobScheduled = true;
                // Add server to list of servers with a reboot schedule
                m_RebootableServers.Add(server.ServerName, server);
            }
            else // A job has already been schedule, just append triggers to it
            {
                trigger.JobName = job.Name;
                trigger.JobGroup = job.Group;
                ManagementService.Instance.Scheduler.ScheduleJob(trigger);
            }
        }
    }
}

【问题讨论】:

    标签: c# quartz-scheduler


    【解决方案1】:

    您似乎将每个触发器设置为同时触发并具有相同的间隔。

    您的“for”循环遍历“i”并没有考虑到“server.GetNextScheduledRebootDateAndTime()”总是返回相同的“下一次”重启时间这一事实。我猜您正在测试一个配置为每周 3 天重新启动的服务器,并且所有触发器都设置为以 7 天的重复间隔同时启动。

    如果您设置为使用 SimpleTrigger,那么您需要将触发器的开始时间与您想要安排重启的星期几移动。

    【讨论】:

    • 完全正确。我在服务器对象中有另一个方法,签名为DateTime? GetNextScheduledRebootDateAndTimeAfter(System.DateTime),我打算在这里使用它。我有点失望,我没听懂。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-20
    • 1970-01-01
    相关资源
    最近更新 更多