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";
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";
properties["quartz.threadPool.type"] = "Quartz.Simpl.SimpleThreadPool, Quartz";
properties["quartz.threadPool.threadCount"] = "5";
properties["quartz.threadPool.threadPriority"] = "Normal";
properties["quartz.scheduler.proxy"] = "true";
properties["quartz.scheduler.proxy.address"] = "tcp://localhost:555/QuartzScheduler";
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:
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 * * ? * *");
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
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); }); } }
quelle