2009-08-31 15 views

答えて

74

あなたは何をしたいか、どのように設定したいかによって、いくつかのオプションがあります。たとえば、Quartz.NetサーバーをスタンドアロンのWindowsサービスとしてインストールし、asp.netアプリケーション内に組み込むこともできます。

あなたが埋め込まれて、それを実行したい場合は、あなたがこの(ソースコードの例から、例えば、#12)のように、あなたのglobal.asaxを言うからサーバーを起動することができます:あなたはそれを実行した場合

NameValueCollection properties = new NameValueCollection(); 
properties["quartz.scheduler.instanceName"] = "RemoteServer"; 

// set thread pool info 
properties["quartz.threadPool.type"] = "Quartz.Simpl.SimpleThreadPool, Quartz"; 
properties["quartz.threadPool.threadCount"] = "5"; 
properties["quartz.threadPool.threadPriority"] = "Normal"; 

ISchedulerFactory sf = new StdSchedulerFactory(properties); 
IScheduler sched = sf.GetScheduler(); 
sched.Start(); 

サービスとしては、(例#12から)このようにそれにリモートで接続します:

NameValueCollection properties = new NameValueCollection(); 
properties["quartz.scheduler.instanceName"] = "RemoteClient"; 

// set thread pool info 
properties["quartz.threadPool.type"] = "Quartz.Simpl.SimpleThreadPool, Quartz"; 
properties["quartz.threadPool.threadCount"] = "5"; 
properties["quartz.threadPool.threadPriority"] = "Normal"; 

// set remoting expoter 
properties["quartz.scheduler.proxy"] = "true"; 
properties["quartz.scheduler.proxy.address"] = "tcp://localhost:555/QuartzScheduler"; 
// First we must get a reference to a scheduler 
ISchedulerFactory sf = new StdSchedulerFactory(properties); 
IScheduler sched = sf.GetScheduler(); 

あなたは(それがリモート処理を介して、またはあなたが埋め込まれたインスタンスを持っているためである)スケジューラへの参照を取得したら、あなたがスケジュールすることができこのようなジョブ:

// define the job and ask it to run 
JobDetail job = new JobDetail("remotelyAddedJob", "default", typeof(SimpleJob)); 
JobDataMap map = new JobDataMap(); 
map.Put("msg", "Your remotely added job has executed!"); 
job.JobDataMap = map; 
CronTrigger trigger = new CronTrigger("remotelyAddedTrigger", "default", "remotelyAddedJob", "default", DateTime.UtcNow, null, "/5 * * ? * *"); 
// schedule the job 
sched.ScheduleJob(job, trigger); 

は、ここで私はQuartz.Netを使い始める人のために書いたいくつかの記事へのリンクです: http://jvilalta.blogspot.com/2009/03/getting-started-with-quartznet-part-1.html

+1

最新のバージョンを使用している投稿などを更新できますか?設定値の形式は今や異なっているようです。ありがとう! quartz.scheduler.exporter.type = Quartz.Simpl.RemotingSchedulerExporter、クォーツ quartz.scheduler.exporter.port = 555 石英コンテキストをリモーティングに #エクスポートこのサーバー: – Snowy

+0

私は2.xのための新しい方法があると思います。 scheduler.exporter.bindName = QuartzScheduler quartz.scheduler.exporter.channelType = tcp quartz.scheduler.exporter.channelName = httpQuartz – NickG

+0

Agh。あなたがコメントに新しい行を持つことができない方法を嫌い! – NickG

2

数週間前、私は、Windows AzureのWorkerロールでジョブをスケジュールするQuartz.Netを使用してについて書きました。それ以来、私はQuartz.Net ISchedulerの周りにラッパーを作成するよう要求しました。 JobScheduleには、CloudConfigurationManagerからスケジュール文字列を読み取り、ジョブをスケジュールする責任があります。

CloudConfigurationManagerは、役割の構成ファイルから設定を読み取ります。この設定ファイルは、クラウドサービスの構成セクションのWindows Azure管理ポータルから編集できます。

次の例では、毎日午前6時、午前8時、午前10時、午後12時30分、午後4時30分に実行する必要があるジョブをスケジュールします。スケジュールは、Visual Studioで編集可能な[ロール]設定で定義されています。役割の設定に到達するには、Windows Azureクラウドサービスプロジェクトに移動し、[役割]フォルダーの下で目的の役割の構成を見つけます。設定ファイルをダブルクリックして設定エディタを開き、[設定]タブに移動します。 「設定を追加」をクリックし、新しい設定に「JobDailySchedule」という名前を付け、その値を6:0,8:0,10:0,12:30,16:30に設定します。

The code from this Post is part of the Brisebois.WindowsAzure NuGet Package 

To install Brisebois.WindowsAzure, run the following command in the Package Manager Console 

PM> Install-Package Brisebois.WindowsAzure 

Get more details about the Nuget Package. 

次に、JobScheduleを使用して、ロールの構成ファイルで定義されたスケジュールを使用して、毎日のジョブをスケジュールします。

var schedule = new JobSchedule(); 

schedule.ScheduleDailyJob("JobDailySchedule", 
          typeof(DailyJob)); 

DailyJobの実装は次のとおりです。これはデモなので、私は仕事に特定のロジックを追加しません。

public class DailyJob : IJob 
{ 
    public void Execute(IJobExecutionContext context) 
    { 
     //Do your daily work here 
    } 
} 

JobScheduleはQuartz.Net ISchedulerをラップします。以前の記事では、サードパーティツールをラッピングすることの重要性について話しましたが、これはジョブスケジューリングロジックが含まれているため、JobScheduleを使用しているコードに影響を与えずにこのロジックを変更する可能性があるため、

ロールの開始時にJobScheduleを構成し、ロールの有効期間全体にわたってJobScheduleインスタンスを維持する必要があります。スケジュールを変更するには、クラウドサービスの設定セクションでWindows Azure管理ポータルから 'JobDailySchedule'設定を変更します。新しいスケジュールを適用するには、クラウドサービスのインスタンスセクションのWindows Azure管理ポータルからロールインスタンスを再起動します。

public class JobSchedule 
{ 
    private readonly IScheduler sched; 

    public JobSchedule() 
    { 
     var schedFact = new StdSchedulerFactory(); 

     sched = schedFact.GetScheduler(); 
     sched.Start(); 
    } 

    /// <summary> 
    /// Will schedule jobs in Eastern Standard Time 
    /// </summary> 
    /// <param name="scheduleConfig">Setting Key from your CloudConfigurations, 
    ///        value format "hh:mm;hh:mm;"</param> 
    /// <param name="jobType">must inherit from IJob</param> 
    public void ScheduleDailyJob(string scheduleConfig, 
           Type jobType) 
    { 
     ScheduleDailyJob(scheduleConfig, 
         jobType, 
         "Eastern Standard Time"); 
    } 

    /// <param name="scheduleConfig">Setting Key from your CloudConfigurations, 
    ///        value format "hh:mm;hh:mm;"</param> 
    /// <param name="jobType">must inherit from IJob</param> 
    public void ScheduleDailyJob(string scheduleConfig, 
           Type jobType, 
           string timeZoneId) 
    { 
     var schedule = CloudConfigurationManager.GetSetting(scheduleConfig); 
     if (schedule == "-") 
      return; 

     schedule.Split(';') 
       .Where(s => !string.IsNullOrWhiteSpace(s)) 
       .ToList() 
       .ForEach(h => 
     { 
      var index = h.IndexOf(':'); 
      var hour = h.Substring(0, index); 
      var minutes = h.Substring(index + 1, h.Length - (index + 1)); 

      var job = new JobDetailImpl(jobType.Name + hour + minutes, null, 
             jobType); 

      var dh = Convert.ToInt32(hour, CultureInfo.InvariantCulture); 
      var dhm = Convert.ToInt32(minutes, CultureInfo.InvariantCulture); 
      var tz = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId); 

      var cronScheduleBuilder = CronScheduleBuilder 
              .DailyAtHourAndMinute(dh, dhm) 
              .InTimeZone(tz); 
      var trigger = TriggerBuilder.Create() 
             .StartNow() 
             .WithSchedule(cronScheduleBuilder) 
             .Build(); 

      sched.ScheduleJob(job, trigger); 
     }); 
    } 

    /// <summary> 
    /// Will schedule jobs in Eastern Standard Time 
    /// </summary> 
    /// <param name="scheduleConfig">Setting Key from your CloudConfigurations, 
    ///        value format "hh:mm;hh:mm;"</param> 
    /// <param name="jobType">must inherit from IJob</param> 
    public void ScheduleWeeklyJob(string scheduleConfig, 
            Type jobType) 
    { 
     ScheduleWeeklyJob(scheduleConfig, 
          jobType, 
          "Eastern Standard Time"); 
    } 


    /// <param name="scheduleConfig">Setting Key from your CloudConfigurations, 
    ///        value format "hh:mm;hh:mm;"</param> 
    /// <param name="jobType">must inherit from IJob</param> 
    public void ScheduleWeeklyJob(string scheduleConfig, 
            Type jobType, 
            string timeZoneId) 
    { 
     var schedule = CloudConfigurationManager.GetSetting(scheduleConfig); 

     schedule.Split(';') 
       .Where(s => !string.IsNullOrWhiteSpace(s)) 
       .ToList() 
       .ForEach(h => 
     { 
      var index = h.IndexOf(':'); 
      var hour = h.Substring(0, index); 
      var minutes = h.Substring(index + 1, h.Length - (index + 1)); 

      var job = new JobDetailImpl(jobType.Name + hour + minutes, null, 
             jobType); 

      var dh = Convert.ToInt32(hour, CultureInfo.InvariantCulture); 
      var dhm = Convert.ToInt32(minutes, CultureInfo.InvariantCulture); 
      var tz = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId); 
      var builder = CronScheduleBuilder 
          .WeeklyOnDayAndHourAndMinute(DayOfWeek.Monday, 
                 dh, 
                 dhm) 
          .InTimeZone(tz); 

      var trigger = TriggerBuilder.Create() 
             .StartNow() 
             .WithSchedule(builder) 
             .Build(); 

      sched.ScheduleJob(job, trigger); 
     }); 
    } 
} 
関連する問題