我使用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,但其他对象也是关闭的。
在通话之前,他们都有:
通话结束后,其中一个为空,其他4人为:
您是否有任何想法找到有关此问题的解决方案?
谢谢,
答案 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#库寻找类似的方法。