2015-09-14 7 views
8

Должен ли метод только прерывать задание, как определено jobKey? Я провел несколько тестов и, похоже, прервал все активные рабочие задания, которые в настоящее время выполняются.Quartz.NET scheduler.Interrupt (jobKey) прерывает все активные задания

Я использую успокоительный веб-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" /> 

Настройки апи клиента являются:

properties["quartz.scheduler.instanceName"] = "RemoteClient"; 
properties["quartz.scheduler.proxy"] = "true"; 
properties["quartz.threadPool.threadCount"] = "0"; 
properties["quartz.scheduler.proxy.address"] = address; 
+0

Хм, тот же вопрос, https://groups.google.com/forum/#!topic/quartznet/tmxXvJ19pG8 –

ответ

0

Прошу прощения, но я, наконец, нашел проблему на своем конце. Это оказалось неправильной конфигурацией моего регистрационного кода, используя NInjectJobFactory.

В принципе, для выполнения каждого задания выполнялся только один экземпляр задания, поэтому флаг, который я устанавливал для остановки прерывания работы, был разделен между всеми заданиями, тем самым останавливая все задания!

3

Чтобы ответить на такие вопросыпроще просто посмотреть исходный код рассматриваемого метода (если это возможно). Если вы посмотрите на исходный код для прерывания, вы увидите примерно следующее:

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(); 
      flag = true; 
     } 
     else { 
      // throws here 
     } 
    } 
    } 
    return interruptedAny; 
} 

Так перечисляет все текущие задания и прерывает любой с согласующей JobKey (который, кстати, делает проверку в вашем коде нет необходимости - вы можете просто make scheduler.Interrupt (jobKey)). Поэтому, если у всех ваших заданий каким-то образом не будет соответствующего ключа, он не должен их удалять.

+0

Вы также можете проверить, что выполняет jobs.Where (x => x.JobDetail.Key.Equals (jobKey)) возвращает – Evk

+0

У них определенно разные ключи работы (другое имя, одна и та же группа), но они имеют одинаковый класс работы и принадлежат одному планировщику –

+0

Ну исходный код не должен лежать :) Если вы говорите, что у всех есть разные ключи, вы можете просто прервать их явно: foreach (var job in executingJobs.Where (x => x.JobDetail.Key.Equals (jobKey)) ((IInterruptableJob) job) .Interrupt(). Но это именно то, что делает Interrupt (jobKey). Кстати, я использую версию 2.3.3 Quartz. – Evk

Смежные вопросы