Question

J'ai un travail dans Quartz.Net qui se déclenche assez souvent et qui dure parfois longtemps. Comment puis-je annuler le déclencheur si le travail est déjà en cours d'exécution?

Était-ce utile?

La solution

La méthode la plus classique consiste à utiliser IInterruptableJob, voir http://quartznet.sourceforge.net /faq.html#howtostopjob . Bien sûr, c’est une autre façon de dire si (! JobRunning) ...

Autres conseils

Ne pourriez-vous pas simplement définir une sorte de variable globale (jobRunning = true) au démarrage du travail et le réinitialiser à la fin du travail?

Ensuite, lorsque le déclencheur est activé, exécutez simplement votre code si (jobRunning == false)

Votre application peut se retirer de la liste des tâches au démarrage et s’insérer à l’arrêt.

De nos jours, vous pouvez utiliser "WithMisfireHandlingInstructionIgnoreMisfires". dans votre déclencheur et utilisez l'attribut [DisallowConcurrentExecution] dans votre travail.

C’était ma mise en œuvre (en utilisant les suggestions du lien que MarkoL avait donné précédemment).

J'essaie juste de sauver du texte en tapant.

Je suis assez nouveau chez Quartz.NET, prenez donc le train ci-dessous avec une salade de sel.

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()));
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top