Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Einführung in Beispiele für die Konfiguration des Quartz.Net-Planungsframeworks

Detaillierte Einführung in Beispiele für die Konfiguration des Quartz.Net-Planungsframeworks

黄舟
黄舟Original
2017-07-20 16:21:302448Durchsuche

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn