2015-09-14 9 views
8

caso in cui il metodo di interrompere solo il lavoro come definito dalla jobKey? Ho eseguito alcuni test e sembra che interrompa tutti i lavori attivi attualmente in esecuzione.Quartz.NET scheduler.Interrupt (jobKey) interrompe tutti i processi attivi

Sto usando un Web API riposante per la connessione al scheduler remota per creare/interrupt/eliminare i lavori.

Api codice di servizio:

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

impostazioni scheduler remota app quarzo sono:

<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" /> 

Le impostazioni del client API sono:

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

Hmm, stessa domanda, https://groups.google.com/forum/#!topic/quartznet/tmxXvJ19pG8 –

risposta

0

Mi scuso ma ho finalmente trovato il problema sulla mia estremità. Si è verificato un errore di configurazione con il mio codice di registrazione utilizzando NInjectJobFactory.

Fondamentalmente, c'era solo una singola istanza di lavoro in esecuzione per ogni esecuzione del lavoro, quindi la flag che stavo impostando per interrompere il lavoro che veniva interrotto era condivisa tra tutte le esecuzioni di lavoro, bloccando così tutti i lavori!

3

Per rispondere a tali domandeè più semplice guardare il codice sorgente del metodo in questione (se possibile). Se si guarda il codice sorgente per interrupt, si vedrà circa questo:

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

Così enumera tutti i lavori in corso e interrompe qualsiasi con il JobKey corrispondenza (che tra l'altro fa controlli nel codice non necessario - si può solo do scheduler.Interrupt (jobKey)). Quindi, a meno che tutti i tuoi lavori non abbiano in qualche modo la chiave corrispondente, non dovrebbero cancellarli tutti.

+0

È anche possibile controllare cosa executingJobs.Where (x => x.JobDetail.Key.Equals (jobKey)) restituisce – Evk

+0

Hanno sicuramente diverse chiavi di lavoro (nome diverso, stesso gruppo), ma hanno la stessa classe di lavoro e appartengono allo stesso programmatore –

+0

Bene il codice sorgente non dovrebbe mentire :) Se dici che hanno tutti chiavi diverse, puoi solo interrompeteli esplicitamente: foreach (var job in executingJobs.Where (x => x.JobDetail.Key.Equals (jobKey)) ((IInterruptableJob) job. .Interrupt(). Ma questo è esattamente ciò che fa Interrupt (jobKey). A proposito, uso la versione 2.3.3 di Quartz. – Evk