2011-07-18 4 views
3

Nous avons utilisé le projet Quartz.net pour contrôler les tâches planifiées dans l'un de nos services Windows. Nous l'utilisons depuis un certain temps maintenant sans problème mais nous avons récemment remarqué un problème avec .NET CLR LocksAndThreads.Quartz.net provoque .NET CLR LocksAndThreads

Veuillez voir cet exemple d'application de ligne de commande écrite en C#.

using System; 
using Quartz; 
using Quartz.Impl; 

namespace QuartzMemTest 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.WriteLine("Quartz Test"); 
      Console.WriteLine("-----------"); 
      Console.WriteLine(Environment.NewLine); 



      ScheduleHelper.ScheduleJob(typeof(MyTask), "MyJobName", "MyTriggerName", "0 0/01 * 1/1 * ? *"); 

      Console.WriteLine("Press any key to exit..."); 
      Console.ReadKey(); 
     } 
    } 


    public class ScheduleHelper 
    { 
     /// <summary> 
     /// Adds a job to the Quartz schedule 
     /// </summary> 
     /// <param name="job">The Job class which inherits from the Quartz.IJob interface</param> 
     /// <param name="jobName">A name to give to the job</param> 
     /// <param name="triggerName">A name to give to the trigger</param> 
     /// <param name="triggerCronExpression">CRON expression to determine the job run interval</param> 
     public static DateTime ScheduleJob(Type job, string jobName, string triggerName, string triggerCronExpression) 
     { 
      // Start the scheduler to run our ImportOpportunitiesJob 
      ISchedulerFactory schedFact = new StdSchedulerFactory(); 
      IScheduler sched = schedFact.GetScheduler(); 
      sched.Start(); 

      // Create an instance of our job 
      JobDetail jobDetail = new JobDetail(jobName, null, job); 

      // Create a CRON trigger which determines the firing interval 
      CronTrigger trigger = new CronTrigger(); 
      trigger.Name = triggerName; 
      trigger.StartTimeUtc = DateTime.UtcNow; 
      trigger.CronExpressionString = triggerCronExpression; 

      // Add job and trigger to the schedule 
      return sched.ScheduleJob(jobDetail, trigger); 
     } 
    } 


    public class MyTask : IStatefulJob 
    { 

     public void Execute(JobExecutionContext job) 
     { 
      Console.WriteLine("MyTask: Doing something...."); 
     } 

    } 
} 

Nous avons remarqué que si nous commençons Analyseur de performances, puis exécutez le code ci-dessus de l'échantillon, nous pouvons voir les LocksAndThreads CLR .NET commencent soudainement à augmenter et continuer à le faire jusqu'à ce que l'application est arrêtée. Un de mes collègues a d'abord remarqué cela après que l'un de nos serveurs en direct s'est écrasé après avoir épuisé ses ressources.

Est-ce que ce sont les Quarts qui causent cela ou quelque chose de stupide que je fais? Si c'est Quartz, y a-t-il quelque chose de différent que je puisse faire pour résoudre le problème?

+0

[Quel compteur dans la catégorie LocksAndThreads] (http://msdn.microsoft.com/en-us/library/zf749bat.aspx) est en train de se détraquer? –

+0

Longueur de la file d'attente actuelle –

+0

Vous ne savez pas quel est votre environnement, mais voici un problème documenté avec ce compteur: https://connect.microsoft.com/VisualStudio/feedback/details/291514/bug-in-current-queue-length- performance-compteur-de-net-clr-locksandthreads-performance-attribut-groupe. FWIW J'offre ce lien parce que nous avons lancé Quartz.Net pendant de longues périodes sans rencontrer ce problème (à court de ressources), mais je n'ai jamais regardé ce compteur. – jvilalta

Répondre

1

Nous avons rencontré un problème similaire sur un projet quartz.net sur lequel j'ai travaillé. Ce que nous avons constaté est que le pool de threads perd parfois des ressources et ne se nettoie pas correctement, dans certaines circonstances. J'ai fini par implémenter un nouveau pool de threads avec un meilleur verrouillage et une notification du moment où les jobs étaient terminés. Cela a résolu le problème pour nous.