web-dev-qa-db-ja.com

ASP.NETでQuartz.netを使用する方法

ASP.NETでQuartz.dllを使用する方法がわかりません。毎朝メールをトリガーするジョブをスケジュールするためのコードを書く場所は?誰かがそれを知っているなら、plzは私を助けてください...

編集:私は PROでQuartz.NETを使用する方法は? が本当に役立つことを発見しました。

72
ACP

やりたいことや設定方法に応じて、いくつかのオプションがあります。たとえば、Quartz.NetサーバーをスタンドアロンのWindowsサービスとしてインストールしたり、asp.netアプリケーション内に埋め込むこともできます。

組み込みで実行する場合は、次のようにglobal.asaxからサーバーを起動できます(ソースコードの例、例#12から)。

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 =

77
jvilalta

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

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

次の例では、毎日午前6時、午前8時、午前10時、12時30分PMおよび午後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);
        });
    }
}
2
Sagar Kute