石英.. 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;

石英.. NET scheduler.Interrupt(jobKey)正在中断所有活动的作业

要回答这样的问题,更容易的方法是查看相关方法的源代码(如果可能的话)。如果您查看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的注册码配置错误。

基本上,每个作业执行只有一个作业实例在运行,所以我设置的用于停止被中断的作业的标志在所有作业执行中共享,从而停止所有作业!