2015-09-14 6 views
8

メソッドはjobKeyで定義されたとおりにジョブを中断する必要がありますか?いくつかのテストを実行しましたが、現在実行中のすべてのアクティブなジョブを中断するようです。Quartz.NETスケジューラ。割り込み(jobKey)がすべてのアクティブなジョブを中断しています

リモートスケジューラに接続してジョブを作成/中断/削除するための安らかな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を使用して登録コードを誤って設定したことが判明しました。

基本的に、ジョブ実行ごとに1つのジョブインスタンスしか実行されないため、中断されているジョブを停止するフラグがすべてのジョブ実行の間で共有され、すべてのジョブが停止されました。

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とのいずれかを割り込み - あなたができるだけスケジューラーを実行する.Interrupt(jobKey))。だからあなたのすべての仕事が何とか一致するキーを持っていない限り - それはそれらをすべて削除するべきではありません。

+0

あなたはまた、実行することができます確認することができます.Jobs.Where(x => x.JobDetail.Key.Equals(jobKey) )返す – Evk

+0

彼らは間違いなく異なるジョブキー(異なる名前、同じグループ)を持っていますが、彼らは同じジョブクラスを持って、同じスケジューラに属しています –

+0

よくソースコードは嘘ではありません:)あなたは彼らがすべて異なるキーを持っていると言うならば、 foreach(x => x.JobDetail.Key.Equals(jobKey))((IInterruptableJob)job).Interrupt()。ただし、これはInterrupt(jobKey)とまったく同じです。ちなみに、私はQuartzのバージョン2.3.3を使用しています。 – Evk

関連する問題