2015-09-14 15 views
8

Yöntem yalnızca işi JobKey tarafından tanımlanan şekilde keser mi? Bazı testler yaptım ve şu anda çalışan tüm aktif işleri kesintiye uğratıyor gibi görünüyor.Quartz.NET scheduler.Interrupt (jobKey) tüm etkin işleri kesintiye uğratıyor

İşleri oluşturmak/kesmek/silmek için uzak zamanlayıcıya bağlanmak için huzurlu bir web API'si kullanıyorum.

Api servis kodu:

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

Kuvars uzaktan zamanlayıcı uygulama ayarları şunlardır:

<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 istemci ayarları şunlardır:

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

Hmm, aynı soru, https://groups.google.com/forum/#!topic/quartznet/tmxXvJ19pG8 –

cevap

0

Özür dilerim ama nihayetinde sorunum sona erdi. Bir NInjectJobFactory kullanarak kayıt kodumla yanlış bir şekilde ortaya çıktı.

Temel olarak, her bir iş yürütme için yalnızca tek bir iş örneği çalışıyordu; böylece işin durdurulmasını durdurduğum bayrağı tüm iş yürütmeleri arasında paylaşıldı, böylece tüm işler durduruldu!

3

tür soruları yanıtlamak içinSöz konusu yöntemin kaynak koduna bakmak daha kolaydır (eğer mümkünse).

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

Yani tüm mevcut işleri sıralar ve bu arada gereksiz Kodunuzdaki kontrolleri yapar eşleştirme JobKey (herhangi kesintisi - Sadece yapabilirsiniz: Eğer Kesilmede kaynak koduna baktığımızda, yaklaşık olarak bu göreceksiniz scheduler.Interrupt (jobKey)) yapın. Yani tüm işlerin bir şekilde eşleşme anahtarı olmadıkça - hepsini silmemelidir.

+0

Ayrıca, ne çalıştırdığını kontrol edebilirsinizJobs.Where (x => x.JobDetail.Key.Equals (jobKey)) – Evk

+0

döndürür Kesinlikle farklı iş anahtarlarına sahipler (farklı adlar, aynı grup), fakat aynı iş sınıfına sahipler ve aynı zamanlayıcıya aitler –

+0

İyi kaynak kodları yalan söylemez :) Eğer hepsinin farklı anahtarları olduğunu söylerseniz onları kesin olarak kes: foreach (Jobs.Where (x => x.JobDetail.Key.Equals (jobKey)) ((IInterruptableJob) iş) .Interrupt(). execute Ancak, bu tam olarak ne Interrupt (jobKey) yapar. Bu arada, Quartz 2.3.3 sürümünü kullanıyorum. – Evk

İlgili konular