Longo executar trabalhos em Quartz.Net
-
05-07-2019 - |
Pergunta
Eu tenho um emprego em Quartz.Net que gatilhos com bastante freqüência, e às vezes é executado por muito tempo, como faço para cancelar o gatilho se o trabalho já está em execução?
Solução
A maneira mais padrão é usar IInterruptableJob, consulte http://quartznet.sourceforge.net /faq.html#howtostopjob . Claro que isto é apenas outra maneira de dizer se (! JobRunning) ...
Outras dicas
Você não poderia apenas definir algum tipo de variável global (jobRunning = true) quando os começos de trabalho e revertê-lo como falso, uma vez que está acabado?
Então, quando o gatilho dispara, basta executar o seu código if (jobRunning == false)
Seu aplicativo poderia retirar-se da lista de trabalhos na inicialização e inserir-se no desligamento.
Hoje em dia você poderia usar "WithMisfireHandlingInstructionIgnoreMisfires" no seu gatilho e uso atributo [DisallowConcurrentExecution] em seu trabalho.
Esta foi a minha aplicação (usando as sugestões no link que MarkoL deu mais cedo).
Eu estou apenas tentando salvar a digitação.
Eu sou muito novo no Quartz.NET, de modo a ter a seguir, com um trem de sal.
public class AnInterruptableJob : IJob, IInterruptableJob
{
private bool _isInterrupted = false;
private int MAXIMUM_JOB_RUN_SECONDS = 10;
/// <summary>
/// Called by the <see cref="IScheduler" /> when a
/// <see cref="ITrigger" /> fires that is associated with
/// the <see cref="IJob" />.
/// </summary>
public virtual void Execute(IJobExecutionContext context)
{
/* See http://aziegler71.wordpress.com/2012/04/25/quartz-net-example/ */
JobKey key = context.JobDetail.Key;
JobDataMap dataMap = context.JobDetail.JobDataMap;
int timeOutSeconds = dataMap.GetInt("TimeOutSeconds");
if (timeOutSeconds <= 0)
{
timeOutSeconds = MAXIMUM_JOB_RUN_SECONDS;
}
Timer t = new Timer(TimerCallback, context, timeOutSeconds * 1000, 0);
Console.WriteLine(string.Format("AnInterruptableJob Start : JobKey='{0}', timeOutSeconds='{1}' at '{2}'", key, timeOutSeconds, DateTime.Now.ToLongTimeString()));
try
{
Thread.Sleep(TimeSpan.FromSeconds(7));
}
catch (ThreadInterruptedException)
{
}
if (_isInterrupted)
{
Console.WriteLine("Interrupted. Leaving Excecute Method.");
return;
}
Console.WriteLine(string.Format("End AnInterruptableJob (should not see this) : JobKey='{0}', timeOutSeconds='{1}' at '{2}'", key, timeOutSeconds, DateTime.Now.ToLongTimeString()));
}
private void TimerCallback(Object o)
{
IJobExecutionContext context = o as IJobExecutionContext;
if (null != context)
{
context.Scheduler.Interrupt(context.FireInstanceId);
}
}
public void Interrupt()
{
_isInterrupted = true;
Console.WriteLine(string.Format("AnInterruptableJob.Interrupt called at '{0}'", DateTime.Now.ToLongTimeString()));
}
}