2009-09-10 6 views

Répondre

2

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

+0

est seulement une instance de cette classe qui implémente IInterruptableJob autorisé à la fois, ou un Job qui utilise cette classe? –

+2

Si vous ne voulez autoriser qu'une seule instance à la fois, IStatefulJob est votre frit, http://quartznet.sourceforge.net/faq.html#howtopreventconcurrentfire. IInterruptableJob vous donne simplement un moyen standard de signaler une interruption et vous devez faire le gros du travail (vérifiez si le drapeau interrompu a été levé). –

1

Pourriez-vous ne pas simplement définir une sorte de variable globale (jobRunning = true) lorsque le travail démarre et revenir à false une fois qu'il est terminé?

Puis, quand les feux de déclenchement, il suffit d'exécuter votre code si (jobRunning == false)

+0

oui, souvent les solutions les plus simples sont les meilleures. J'ai mis en œuvre ceci, je pensais qu'il y avait une solution implémentée pour cela qui a mis le travail en pause jusqu'à ce que le premier soit fait, mais peu importe, cela fonctionne très bien! –

0

Votre application pourrait se retirer de la liste des tâches au démarrage et insérer lui-même à l'arrêt.

0

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

0

Cela a été ma mise en œuvre (en utilisant les suggestions sur le lien que MarkoL a donné plus tôt). J'essaye juste de sauver un peu de dactylographie. Je suis assez nouveau chez Quartz.NET, alors prenez le ci-dessous avec un train 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())); 
    } 
} 
Questions connexes