Heim > Artikel > Backend-Entwicklung > Detaillierte Einführung in Beispiele für die Konfiguration des Quartz.Net-Planungsframeworks
In diesem Artikel wird hauptsächlich die Konfigurationsmethode des Quartz.Net-Planungsframeworks im Detail vorgestellt, die einen gewissen Referenzwert hat.
Es wird geschätzt, dass die meisten von ihnen in der täglichen Arbeit darauf zurückgreifen erledigte Abstimmungsplanungsaufgaben, wie geplante Abstimmungsdatenbanksynchronisierung, geplante E-Mail-Benachrichtigungen usw. Jeder hat solche Aufgaben über geplante Windows-Aufgaben, Windows-Dienste usw. implementiert und sogar sein eigenes benutzerdefiniertes Konfigurationsframework implementiert. Deshalb werde ich heute Quartz.Net vorstellen, ein Open-Source-Planungsframework (hauptsächlich Einführung in die Konfigurationsimplementierung, da ein Freund solche Fragen gestellt hat). Der Implementierungscode der Planung ist sehr einfach. Der Quellcode enthält viele Demos, die hier übersprungen werden.
Die neueste Version von Quartz.Net, Quartz.NET 2.0 Beta 1 veröffentlicht
1. Dateibasierte Konfiguration
Werfen wir einen Blick darauf Zuerst der einfache Implementierungscode
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using Quartz; using Quartz.Impl; using Common.Logging; namespace Demo { class Program { static void Main(string[] args) { // First we must get a reference to a scheduler ISchedulerFactory sf = new StdSchedulerFactory(); IScheduler sched = sf.GetScheduler(); sched.Start(); sched.Shutdown(true); } } }
Der Code ist sehr einfach. Wie werden die grundlegende Quarzkonfiguration in der Konfigurationsdatei sowie die Job- und Triggerinformationen geladen? Dieser Prozess erfolgt im IScheduler sched = sf.GetScheduler();-Prozess, der sich hauptsächlich im Quellcodeabschnitt widerspiegelt
public void Initialize() { // short-circuit if already initialized if (cfg != null) { return; } if (initException != null) { throw initException; } NameValueCollection props = (NameValueCollection) ConfigurationManager.GetSection("quartz"); string requestedFile = Environment.GetEnvironmentVariable(PropertiesFile); string propFileName = requestedFile != null && requestedFile.Trim().Length > 0 ? requestedFile : "~/quartz.config"; // check for specials propFileName = FileUtil.ResolveFile(propFileName); if (props == null && File.Exists(propFileName)) { // file system try { PropertiesParser pp = PropertiesParser.ReadFromFileResource(propFileName); props = pp.UnderlyingProperties; Log.Info(string.Format("Quartz.NET properties loaded from configuration file '{0}'", propFileName)); } catch (Exception ex) { Log.Error("Could not load properties for Quartz from file {0}: {1}".FormatInvariant(propFileName, ex.Message), ex); } } if (props == null) { // read from assembly try { PropertiesParser pp = PropertiesParser.ReadFromEmbeddedAssemblyResource("Quartz.quartz.config"); props = pp.UnderlyingProperties; Log.Info("Default Quartz.NET properties loaded from embedded resource file"); } catch (Exception ex) { Log.Error("Could not load default properties for Quartz from Quartz assembly: {0}".FormatInvariant(ex.Message), ex); } } if (props == null) { throw new SchedulerConfigException( @"Could not find <quartz> configuration section from your application config or load default configuration from assembly. Please add configuration to your application config file to correctly initialize Quartz."); } Initialize(OverrideWithSysProps(props)); }
Durch die obige Codeanalyse wird die Initialisierung durchgeführt prüft zunächst, ob in der Systemkonfiguration ein 9b4c701a111f87c1cd1643746af7699b-Konfigurationsabschnittsknoten vorhanden ist (config bezieht sich auf app.config, web.config. Wenn die Systemkonfiguration einen Quarzknoten hat, laden Sie die Konfigurationsinformationen hier direkt). Wenn die Systemkonfiguration nicht über die grundlegenden Konfigurationsinformationen von Quartz verfügt, wird weiterhin nach der Existenz der beiden Konfigurationsdateien quartz.config/Quartz.quartz.config gesucht. Wenn nicht, werden die Konfigurationsinformationen geladen. Es wird eine Initialisierungskonfigurationsausnahme ausgelöst.
Und jobs.xml (Konfigurationsdatei für geplante Aufgaben und Trigger-Plugin-Knoten)
App.config/web.config-Plugin-Konfiguration
<quartz> <add key="quartz.scheduler.instanceName" value="ExampleDefaultQuartzScheduler"/> <add key="quartz.threadPool.type" value="Quartz.Simpl.SimpleThreadPool, Quartz"/> <add key="quartz.threadPool.threadCount" value="10"/> <add key="quartz.threadPool.threadPriority" value="2"/> <add key="quartz.jobStore.misfireThreshold" value="60000"/> <add key="quartz.jobStore.type" value="Quartz.Simpl.RAMJobStore, Quartz"/> <!--******************************Plugin配置********************************************* --> <add key="quartz.plugin.xml.type" value="Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin, Quartz" /> <add key="quartz.plugin.xml.fileNames" value="quartz_jobs.xml"/> </quartz>
Die Plugin-Konfiguration in quartz.config verweist auf (quartz.plugin.xml.type / quartz.plugin.xml.fileNames)
# You can configure your scheduler in either <quartz> configuration section # or in quartz properties file # Configuration section has precedence quartz.scheduler.instanceName = ServerScheduler # configure thread pool info quartz.threadPool.type = Quartz.Simpl.SimpleThreadPool, Quartz quartz.threadPool.threadCount = 10 quartz.threadPool.threadPriority = Normal #--------------------------------*************plugin配置------------------------------------ # job initialization plugin handles our xml reading, without it defaults are used quartz.plugin.xml.type = Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin, Quartz quartz.plugin.xml.fileNames = ~/quartz_jobs.xml # export this server to remoting context 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
2. Codebasierte Methode
Diese Situation wird direkt durch Code realisiert. Viele offizielle DEMOs sind so:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Quartz; using Quartz.Impl; using System.Threading; using Common.Logging; namespace Demo { class Program { static void Main(string[] args) { ILog log = LogManager.GetLogger(typeof(Demo.HelloJob)); log.Info("------- Initializing ----------------------"); // First we must get a reference to a scheduler ISchedulerFactory sf = new StdSchedulerFactory(); IScheduler sched = sf.GetScheduler(); log.Info("------- Initialization Complete -----------"); //---------------------------------------代码添加job和trigger // computer a time that is on the next round minute DateTimeOffset runTime = DateBuilder.EvenMinuteDate(DateTimeOffset.UtcNow); log.Info("------- Scheduling Job -------------------"); // define the job and tie it to our HelloJob class IJobDetail job = JobBuilder.Create<HelloJob>() .WithIdentity("job1", "group1") .Build(); // Trigger the job to run on the next round minute ITrigger trigger = TriggerBuilder.Create() .WithIdentity("trigger1", "group1") .StartAt(runTime) .Build(); // Tell quartz to schedule the job using our trigger sched.ScheduleJob(job, trigger); log.Info(string.Format("{0} will run at: {1}", job.Key, runTime.ToString("r"))); // Start up the scheduler (nothing can actually run until the // scheduler has been started) sched.Start(); log.Info("------- Started Scheduler -----------------"); // wait long enough so that the scheduler as an opportunity to // run the job! log.Info("------- Waiting 65 seconds... -------------"); // wait 65 seconds to show jobs Thread.Sleep(TimeSpan.FromSeconds(65)); // shut down the scheduler log.Info("------- Shutting Down ---------------------"); sched.Shutdown(true); log.Info("------- Shutdown Complete -----------------"); } } }
Tatsächlich wurde die Codemethode mit der Konfigurationsdatei gemischt. Diese Methode besteht jedoch darin, den Job zu laden und die Konfiguration über die Konfigurationszuordnung auszulösen. Wir haben auch eine dritte Methode, die darin besteht, die Job- und Trigger-Konfigurationsdateien selbst zu laden.
3. Laden Sie die Konfigurationsdatei manuell
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Quartz; using Quartz.Xml; using Quartz.Impl; using Quartz.Simpl; using System.Threading; using Common.Logging; using System.IO; namespace Demo { class Program { static void Main(string[] args) { XMLSchedulingDataProcessor processor = new XMLSchedulingDataProcessor(new SimpleTypeLoadHelper()); ISchedulerFactory sf = new StdSchedulerFactory(); IScheduler scheduler = sf.GetScheduler(); Stream s = new StreamReader("~/quartz.xml").BaseStream; processor.ProcessStream(s, null); processor.ScheduleJobs(scheduler); scheduler.Start(); scheduler.Shutdown(); } } }
Oder so:
using System.Text; using Quartz; using Quartz.Xml; using Quartz.Impl; using Quartz.Simpl; using System.Threading; using Common.Logging; using System.IO; namespace Demo { class Program { static void Main(string[] args) { XMLSchedulingDataProcessor processor = new XMLSchedulingDataProcessor(new SimpleTypeLoadHelper()); ISchedulerFactory sf = new StdSchedulerFactory(); IScheduler scheduler = sf.GetScheduler(); processor.ProcessFileAndScheduleJobs("~/quartz.xml",scheduler); scheduler.Start(); scheduler.Shutdown(); } } }
Derzeit gibt es, basierend auf der Quellcode-Analyse, ungefähr diese Konfigurationsmethoden, die sehr flexibel sind und beliebig kombiniert werden können. Der Quellcode für die Verwendung von Quarz ist sehr detailliert und es gibt viele Lernartikel im Garten.
Denken Sie daran, zuerst die Quarzkonfiguration zu lesen: app.config/web.config ---->quartz.config/Quartz.quartz.config ---->quartz_jobs.xml .
Durch Code können wir den Punkt von quartz_jobs.xml in die neu benannte XML-Datei ändern
(Der Standardwert quartz_jobs.xml ist in XMLSchedulingDataProcessor.QuartzXmlFileName = "quartz_jobs.xml" angegeben)
Methode 1: Zeigen Sie über quartz node/quartz.config auf die angegebene jobs.xml.
Methode 2: Laden Sie die angegebene jobs.xml über XMLSchedulingDataProcessor
Das obige ist der detaillierte Inhalt vonDetaillierte Einführung in Beispiele für die Konfiguration des Quartz.Net-Planungsframeworks. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!