2015-09-14 23 views
8

該方法是否應按照jobKey定義的方式中斷作業?我已經運行了一些測試,它似乎中斷了當前正在運行的所有活動作業。Quartz.NET scheduler.Interrupt(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; 
+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(其中的方式,使檢查你的代碼不必要的中斷任何 - 你可以只做scheduler.Interrupt(jobKey))。因此,除非您的所有工作以某種方式具有匹配關鍵 - 它不應該全部刪除它們。

+0

你也可以檢查一下executionJobs.Where(x => x.JobDetail.Key.Equals(jobKey) )返回 – Evk

+0

他們肯定有不同的工作密鑰(不同的名稱,相同的組),但他們具有相同的工作類並屬於相同的調度程序 –

+0

那麼源代碼不應該說謊:)如果你說他們都有不同的密鑰,你可以中斷他們顯式:foreach(在jobJobs.Where中的作業(x => x.JobDetail.Key.Equals(jobKey))((IInterruptableJob)作業).Interrupt()但是,這正是中斷(jobKey)所做的。順便說一句,我使用Quartz 2.3.3版本。 – Evk