2011-07-18 11 views
3

Quartz.netプロジェクトを使用して、Windowsサービスのスケジュールされたタスクを制御しています。 これまでのところ問題なく使用していましたが、最近、.NET CLR LocksAndThreadsに問題があることがわかりました。Quartz.netは.NET CLR LocksAndThreadsを発生させます

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...."); 
     } 

    } 
} 

我々は最初のパフォーマンスモニタを起動して、上記のサンプルコードを実行した場合、我々は、.NET CLRのLocksAndThreadsが急に増加し、アプリが停止されるまでそうし続けるために始める見ることができることに気づきました。 私の同僚は、私たちのライブサーバーの1つがリソース不足の後にクラッシュした後、これを最初に気付きました。

これは何かを引き起こしているクォートですか、私がやっていることは何ですか? Quartzの場合、問題を解決するために何か別の方法がありますか?

+0

[LocksAndThreadsカテゴリのどのカウンター](http://msdn.microsoft.com/en-us/library/zf749bat.aspx)は大騒ぎになっていますか? –

+0

現在のキューの長さ –

+0

環境がどのようなものかはっきりしていませんが、そのカウンタで説明されている問題があります。https://connect.microsoft.com/VisualStudio/feedback/details/291514/bug-in-current-queue-length- net-clr-locksおよびthread-performance-attribute-groupのパフォーマンスカウンタ。 FWIW私はQuartz.Netを長時間実行していないのでこのリンクを提供しています(資源が足りなくなります)。しかし、私はこのカウンタを見たことはありません。 – jvilalta

答えて

1

私が取り組んだquartz.netプロジェクトでも同様の問題が発生しました。私たちが見つけたのは、Thread Poolがリソースを漏洩することがあり、特定の状況下では、スレッドプールが正しくクリーンアップされないということです。私は、ジョブが実際に完了したときのより良いロックと通知を備えた新しいスレッドプールを実装しました。これにより私たちの問題は解決しました。

関連する問題