Quartz.net Shutdown关闭所有调度程序

时间:2014-10-15 09:16:42

标签: c# quartz.net

我使用Quartz.net在Windows服务中创建5个调度程序。 但是当我想关闭我的一个调度程序时,它会关闭它们。

这是我的班级:

internal class Scheduler
{
    private IScheduler shed;
    public SchedulerConfig config { get; private set; }

    internal Scheduler(SchedulerConfig config)
    {
        this.config = config;
    }

    internal void Schedule()
    {
        ISchedulerFactory sf = new Quartz.Impl.StdSchedulerFactory();
        shed = sf.GetScheduler();

        Type T = config.job;

        IJobDetail job = JobBuilder.Create(T)
            .WithIdentity("job_" + config.name, "groupScheduler")
            .Build();

        string cronExpression = config.cronExpression;

        ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create()
                                    .WithIdentity("trigger_" + config.name, "groupScheduler")
                                    .WithCronSchedule(cronExpression)
                                    .Build();

        job.JobDataMap.Put("SchedulerConfig", config);

        DateTimeOffset ft = shed.ScheduleJob(job, trigger);

        shed.Start();
    }

    internal void Stop()
    {
        if (shed != null && !shed.IsShutdown)
        {
            shed.Shutdown(false);
            shed = null;
        }
    }
}

调度程序使用不同的“调度程序配置”,并使用不同的名称'。

是因为它们都具有相同的组名吗?

当我打电话给'停止'方法,该对象的IShcheduler为null,但其他对象也是关闭的。

在通话之前,他们都有:

  • IsStandByMode = false
  • IsShutdown = false
  • IsStarted = true

通话结束后,其中一个为空,其他4人为:

  • IsStandByMode = true
  • IsShutdown = true
  • IsStarted = true

您是否有任何想法找到有关此问题的解决方案?

谢谢,

2 个答案:

答案 0 :(得分:1)

创建调度程序实例时,应该为其指定唯一的实例名称。这样您就可以关闭特定的调度程序而不是所有调度程序。检查StdSchedulerFactory.GetScheduler方法源,您将了解所有内容。

        var props = new NameValueCollection
    {
        {"quartz.scheduler.interruptJobsOnShutdownWithWait", "true"},
        {"quartz.scheduler.instanceName", nameof(CheckPricesScheduler)}
    };

    var schedulerFactory = new StdSchedulerFactory(props);

答案 1 :(得分:0)

如果您查看石英文档,您会发现shed.Shutdown(false);不是停止某些特定触发器或job.hutdown方法的正确方法

 Halts the Scheduler's firing of Triggers, and cleans up all resources associated with the Scheduler.

所以要停止个别工作或触发,请使用pauseJob(JobKey jobKey)pauseJobs(GroupMatcher<JobKey> matcher)pauseTrigger(TriggerKey triggerKey)pauseTriggers(GroupMatcher<TriggerKey> matcher)方法

我已经为上述函数引用了java文档,请为石英项目的c#库寻找类似的方法。