【问题标题】:Quartz.NET scheduler.Interrupt(jobKey) is interrupting all active jobsQuartz.NET scheduler.Interrupt(jobKey) 正在中断所有活动作业
【发布时间】:2015-09-14 21:00:03
【问题描述】:

该方法应该只中断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);
}

Quartz 远程调度程序应用设置为:

<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;

【问题讨论】:

标签: c# .net quartz.net


【解决方案1】:

要回答此类问题,只需查看相关方法的源代码(如果可能)会更容易。如果您查看中断的源代码,您会看到大致如下:

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))。因此,除非您的所有工作都以某种方式具有匹配的密钥 - 它不应该将它们全部删除。

【讨论】:

  • 您还可以查看 executionJobs.Where(x => x.JobDetail.Key.Equals(jobKey)) 返回的内容
  • 它们肯定有不同的作业键(不同的名称,相同的组),但它们确实具有相同的作业类并且属于同一个调度程序
  • 源代码不应该撒谎 :) 如果你说它们都有不同的键,你可以明确地打断它们:foreach (var job in executionJobs.Where(x => x.JobDetail.Key. Equals(jobKey)) ((IInterruptableJob)job).Interrupt()。但是,这正是 Interrupt(jobKey) 所做的。顺便说一下,我使用的是 Quartz 2.3.3 版本。
  • 嗯,是的,这就是我如此困惑的原因,我为一项工作传递了确切的工作密钥,但所有工作都被中断了(使用不同的工作密钥)。我也在使用相同的版本。我会继续挖掘。可能与基于远程/客户端的架构有关
  • 终于找到了,是我这边的问题,谢谢帮助!
【解决方案2】:

我很抱歉,但我终于找到了问题所在。结果是我使用NInjectJobFactory 的注册码配置错误。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-28
    相关资源
    最近更新 更多