2010-09-22 8 views
0

J'ai une bibliothèque de classes (C#, .net 4.0) implémentant une classe wrapper pour un planificateur Quartz.net et un tas de déclencheurs et de tâches que je aimerais avoir exécuté. Cette classe wrapper a un simple math (Start) et Stop() pour démarrer ou arrêter le planificateur. Lorsque j'instancie mon wrapper à partir d'une application de console, il enregistre mes Jobs + Triggers et tout fonctionne correctement. Tous les travaux s'exécutent comme prévu et lorsqu'ils sont attendus. Lorsque je fais la même chose à l'intérieur d'un service Windows (que j'ai construit en tant que conteneur pour le planificateur), certains déclencheurs ne se déclenchent jamais alors que d'autres fonctionnent comme prévu. Tous mes déclencheurs sont très simples, comme exécuter toutes les x minutes et répéter pour toujours. J'ai branché un ITriggerListener global et déconnecté tout. Les Triggers manquants ne tirent pas et ils ne ratent pas. C'est comme s'ils n'étaient pas présents.Quartz.net - Le déclencheur ne se déclenche pas lorsque le planificateur s'exécute dans un service Windows

Malheureusement, je n'ai pas réussi à configurer la journalisation de l'infrastructure Common.Logging utilisée par Quartz, donc je n'ai aucune information sur ce qui se passe à l'intérieur. Toute aide est grandement appréciée.

+0

J'ai réussi à faire fonctionner Quartz.NET + Common.Logging + log4net (consultez http://dotnetsamples.codeplex.com si cela vous intéresse) mais j'ai le même problème quand il s'agit de courir le travail de shedule dans un service de Windows et malheureusement la notation n'est pas utile. –

+0

Avez-vous trouvé des mises à jour ou une solution à cela? Je viens de remarquer le même "genre" de comportement ... seulement mes Triggers dans mon application de console arrêtent de tirer après un certain temps. – Adam

Répondre

0

Vous avez mentionné que vous exécutez la fonctionnalité Quartz dans un service Windows. Je suppose que vous utilisez quelque chose qui hérite de ScheduleService, remplaçant ainsi les méthodes OnStop() et OnStart (args() as String) et je suppose que vous avez votre Schedule et vos jobs et triggers enregistrés dans la méthode OnStart du service.

Si c'est le cas, assurez-vous que vous empêchez le Garbage Collector de "nettoyer" vos objets.

Gc.KeepAlive(object) 

Par exemple, laisse imaginer que nous avons un System.Timers.Timer à l'intérieur du OnStart pour le service Windows. Il faudrait dire que le garbage collector pour laisser seul la minuterie, après avoir défini de minuterie au niveau de la classe (comme une variable d'objet, non pas comme une variable de fonction locale)

Private timer As System.Timers.Timer 

..et à l'intérieur du OnStart (

timer As System.Timers.Timertimer = New System.Timers.Timer() 
AddHandler timer.Elapsed, AddressOf Tick 'here you define that Tick method will handle it 
timer.Enabled = true 
timer.Interval = 200000 
GC.KeepAlive(timer) 'tell the GC to leave alone the timer 

Cela pourrait-il être quelque chose de similaire avec votre implémentation Quartz?