石英.. NET scheduler.Interrupt(jobKey)正在中断所有活动的作业
本文关键字:中断 活动 作业 scheduler NET Interrupt jobKey 石英 | 更新日期: 2023-09-27 18:12:40
方法应该只中断由jobKey定义的作业吗?我已经运行了一些测试,它似乎中断了当前正在运行的所有活动作业。
我使用restful web api连接到远程调度器来创建/中断/删除作业。
Api服务代码:public void DeleteJob(JobKey jobKey)
{
var scheduler = _clientQuartzScheduler.GetScheduler();
var executingJobs = scheduler.GetCurrentlyExecutingJobs();
if (executingJobs.Any(x => x.JobDetail.Key.Equals(jobKey)))
{
scheduler.Interrupt(jobKey);
}
scheduler.DeleteJob(jobKey);
}
石英远程调度程序应用程序设置为:
<add key="quartz.threadPool.type" value="Quartz.Simpl.SimpleThreadPool, Quartz" />
<add key="quartz.threadPool.threadCount" value="10" />
<add key="quartz.threadPool.threadPriority" value="Normal" />
<add key="quartz.scheduler.exporter.type" value="Quartz.Simpl.RemotingSchedulerExporter, Quartz" />
<add key="quartz.scheduler.exporter.port" value="555" />
<add key="quartz.scheduler.exporter.bindName" value="QuartzScheduler" />
<add key="quartz.scheduler.exporter.channelType" value="tcp" />
<add key="quartz.scheduler.exporter.channelName" value="httpQuartz" />
<add key="quartz.scheduler.exporter.rejectRemoteRequests" value="false" />
<add key="quartz.jobStore.clustered" value="false" />
<add key="quartz.jobStore.misfireThreshold" value="60000" />
<add key="quartz.jobStore.type" value="Quartz.Impl.AdoJobStore.JobStoreTX, Quartz" />
<add key="quartz.jobStore.lockHandler.type" value="Quartz.Impl.AdoJobStore.UpdateLockRowSemaphore, Quartz" />
<add key="quartz.jobStore.useProperties" value="true" />
<add key="quartz.jobStore.dataSource" value="default" />
<add key="quartz.jobStore.tablePrefix" value="QRTZ_" />
<add key="quartz.jobStore.driverDelegateType" value="Quartz.Impl.AdoJobStore.MySQLDelegate, Quartz" />
<add key="quartz.dataSource.default.provider" value="MySql-65" />
<add key="quartz.dataSource.default.connectionStringName" value="DatabaseConnectionString" />
api客户端设置:
properties["quartz.scheduler.instanceName"] = "RemoteClient";
properties["quartz.scheduler.proxy"] = "true";
properties["quartz.threadPool.threadCount"] = "0";
properties["quartz.scheduler.proxy.address"] = address;
要回答这样的问题,更容易的方法是查看相关方法的源代码(如果可能的话)。如果您查看Interrupt的源代码,您将看到大致如下:
public virtual bool Interrupt(JobKey jobKey)
{
var currentlyExecutingJobs = this.CurrentlyExecutingJobs;
bool interruptedAny = false;
foreach (var executionContext in currentlyExecutingJobs)
{
var jobDetail = executionContext.JobDetail;
if (jobKey.Equals((object) jobDetail.Key))
{
var interruptableJob = executionContext.JobInstance as IInterruptableJob;
if (interruptableJob != null) {
interruptableJob.Interrupt();
interruptedAny = true;
}
else {
// throws here
}
}
}
return interruptedAny;
}
因此它枚举所有当前的作业,并使用匹配的JobKey中断任何作业(顺便说一下,这使得代码中的检查不必要-您可以只执行scheduler.Interrupt(JobKey))。所以,除非你所有的作业都有匹配的关键字,否则不应该将它们全部删除。
我很抱歉,但我最终发现了问题。结果是我使用NInjectJobFactory
的注册码配置错误。
基本上,每个作业执行只有一个作业实例在运行,所以我设置的用于停止被中断的作业的标志在所有作业执行中共享,从而停止所有作业!