J'ai un travail dans Quartz.Net qui se déclenche assez souvent, et fonctionne parfois longtemps, comment puis-je annuler le déclencheur si le travail est déjà en cours d'exécution?Longues tâches en cours dans Quartz.Net
Répondre
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) ...
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)
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! –
Votre application pourrait se retirer de la liste des tâches au démarrage et insérer lui-même à l'arrêt.
De nos jours, vous pouvez utiliser "WithMisfireHandlingInstructionIgnoreMisfires" dans votre déclencheur et utiliser l'attribut [DisallowConcurrentExecution] dans votre travail.
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()));
}
}
- 1. Progression du travail Quartz.Net
- 2. Documentation du serveur Quartz.NET
- 3. Longues lignes dans LaTeX
- 4. Est-il possible de dire quelles tâches sont en cours d'exécution dans la bibliothèque parallèle de tâches?
- 5. Configuration de ADOJobStore avec Quartz.net
- 6. Comment vérifier si un processus est en cours d'exécution dans le gestionnaire de tâches avec python
- 7. Le déclenchement Quartz.NET ne se déclenche pas
- 8. Comment gérer les longues comparaisons dans SQL
- 9. Multiplier les valeurs longues?
- 10. Modèles ActiveRecord mis en cache dans des tâches rake?
- 11. AS3: Détecter les touches longues
- 12. WCF - Comment accepter les chaînes longues en tant que paramètres
- 13. Port de l'appel en cours dans Remoting
- 14. JavaScript en cours d'exécution dans Firefox
- 15. Recharger le cadre en cours dans AS2?
- 16. Arrêt en cours CAKeyframeAnimation
- 17. en cours d'exécution fichier bat en utilisant Windows Scheduler
- 18. Tâches antrun multiples dans maven
- 19. Trouver les plus longues chaînes répétées?
- 20. Raccourci Eclipse pour fendre des chaînes longues
- 21. Tâche de tâches du planificateur de tâches Windows dans une application .net
- 22. Débogueur XCode: afficher les chaînes longues
- 23. tâches de fond en course asp.net
- 24. longues lignes de code vs lisibilité
- 25. Site en cours de visualisation
- 26. Mise en attente des modifications en cours dans TFS
- 27. trouver de longues sous-chaînes répétées dans une chaîne massive
- 28. Problèmes dans classloaders pour l'exécution de longues processus Tomcat
- 29. Pourquoi plus de variables longues provoquent concaténation?
- 30. Masquer la barre des tâches en utilisant C#
est seulement une instance de cette classe qui implémente IInterruptableJob autorisé à la fois, ou un Job qui utilise cette classe? –
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é). –