Verwendung von Quartz.net mit ASP.NET


72

Ich weiß nicht, wie ich Quartz.dll in ASP.NET verwenden soll. Wo soll der Code für die Planung von Jobs geschrieben werden, um jeden Morgen E-Mails auszulösen? Bitte, wenn jemand davon weiß, bitte hilf mir ...

Bearbeiten: Ich habe festgestellt, wie man Quartz.NET auf PRO-Weise verwendet. wirklich nützlich sein.

Antworten:


77

Sie haben verschiedene Möglichkeiten, je nachdem, was Sie tun und wie Sie es einrichten möchten. Sie können beispielsweise einen Quartz.Net-Server als eigenständigen Windows-Dienst installieren oder ihn auch in Ihre asp.net-Anwendung einbetten.

Wenn Sie es eingebettet ausführen möchten, können Sie den Server wie folgt starten: beispielsweise anhand Ihrer global.asax (anhand der Quellcodebeispiele, Beispiel 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();

Wenn Sie es als Dienst ausführen, stellen Sie wie folgt eine Remoteverbindung her (ab Beispiel 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();

Sobald Sie einen Verweis auf den Scheduler haben (sei es per Remoting oder weil Sie eine eingebettete Instanz haben), können Sie Jobs wie folgt planen:

// 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);

Hier ist ein Link zu einigen Posts, die ich für Leute geschrieben habe, die mit Quartz.Net anfangen: http://jvilalta.blogspot.com/2009/03/getting-started-with-quartznet-part-1.html


1
Könnten Sie die Beiträge usw. aktualisieren, die die neueste Version verwenden? Es scheint, dass das Format für die Konfigurationswerte jetzt anders ist. Vielen Dank!
Snowy

Ich denke, der neuere Weg für 2.x ist: # Exportieren Sie diesen Server in den Remoting-Kontext quartz.scheduler.exporter.type = Quartz.Simpl.RemotingSchedulerExporter, Quartz quartz.scheduler.exporter.port = 555 quartz.scheduler.exporter.bindName = QuartzScheduler quartz.scheduler.exporter.channelType = tcp quartz.scheduler.exporter.channelName = httpQuartz
NickG

Agh. Hassen Sie, wie Sie keine neuen Zeilen in Kommentaren haben können!
NickG

2

Vor einigen Wochen schrieb ich über die Verwendung von Quartz.Net zum Planen von Jobs in Windows Azure Worker-Rollen. Seitdem bin ich auf eine Anforderung gestoßen, die mich dazu veranlasste, einen Wrapper um den Quartz.Net IScheduler zu erstellen. Der JobSchedule hat die Verantwortung, eine Zeitplanzeichenfolge aus dem CloudConfigurationManager zu lesen und einen Job zu planen.

Der CloudConfigurationManager liest Einstellungen aus der Konfigurationsdatei der Rolle, die über das Windows Azure-Verwaltungsportal im Abschnitt "Konfigurieren" Ihrer Cloud-Dienste bearbeitet werden kann.

Im folgenden Beispiel wird ein Job geplant, der täglich um 6 Uhr, 8 Uhr, 10 Uhr, 12:30 Uhr und um 16:30 Uhr ausgeführt werden muss. Der Zeitplan wird in den Rolleneinstellungen definiert, die über Visual Studio bearbeitet werden können. Um zu den Rolleneinstellungen zu gelangen, rufen Sie Ihr Windows Azure Cloud Service-Projekt auf und suchen Sie die gewünschten Rollenkonfigurationen im Ordner Rolle. Öffnen Sie den Konfigurationseditor, indem Sie auf die Konfigurationsdatei doppelklicken, und navigieren Sie zur Registerkarte "Einstellungen". Klicken Sie auf "Einstellung hinzufügen" und benennen Sie die neue Einstellung "JobDailySchedule" und setzen Sie ihren Wert auf 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.

Verwenden Sie dann den JobSchedule-Zeitplan für einen täglichen Job, indem Sie den in der Konfigurationsdatei der Rolle definierten Zeitplan verwenden.

var schedule = new JobSchedule();

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

Die DailyJob-Implementierung sieht wie folgt aus. Da dies eine Demo ist, werde ich dem Job keine spezifische Logik hinzufügen.

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

Das JobSchedule umschließt den Quartz.Net IScheduler. In einem früheren Beitrag habe ich darüber gesprochen, wie wichtig es ist, Tools von Drittanbietern zu verpacken. Dies ist ein hervorragendes Beispiel, da ich die Jobplanungslogik enthalte und diese Logik möglicherweise ändern könnte, ohne den Code zu beeinflussen, der JobSchedule verwendet.

Die JobSchedule sollte beim Start der Rolle konfiguriert und die JobSchedule-Instanz während der gesamten Lebensdauer der Rolle beibehalten werden. Das Ändern des Zeitplans kann durch Ändern der Einstellung "JobDailySchedule" über das Windows Azure-Verwaltungsportal im Abschnitt "Konfigurieren" Ihrer Cloud-Dienste erreicht werden. Starten Sie anschließend die Rolleninstanz über das Windows Azure-Verwaltungsportal im Abschnitt Instanzen Ihrer Cloud-Dienste neu, um den neuen Zeitplan anzuwenden.

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);
        });
    }
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.