Maison  >  Article  >  développement back-end  >  Introduction détaillée aux exemples de configuration du cadre de planification Quartz.Net

Introduction détaillée aux exemples de configuration du cadre de planification Quartz.Net

黄舟
黄舟original
2017-07-20 16:21:302448parcourir

Cet article présente principalement en détail la méthode de configuration du cadre de planification Quartz.Net, qui a une certaine valeur de référence. Les amis intéressés peuvent s'y référer

Dans le travail quotidien, on estime que la plupart d'entre eux l'ont. effectué des tâches de planification d'interrogation, telles que la synchronisation programmée de la base de données d'interrogation, les notifications programmées par e-mail, etc. Tout le monde a implémenté de telles tâches via des tâches planifiées Windows, des services Windows, etc., et a même implémenté son propre cadre de configuration personnalisé. Aujourd'hui, je vais donc présenter le framework de planification open source Quartz.Net (présentant principalement l'implémentation de la configuration, car un ami a posé de telles questions). Le code d'implémentation de la planification est très simple. Il y a beaucoup de démos dans le code source, qui seront ignorées ici.

La dernière version de Quartz.Net, Quartz.NET 2.0 bêta 1 publiée

1. Configuration basée sur des fichiers

Jetons un coup d'œil à le code d'implémentation simple d'abord


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

Le code est très simple. Comment la configuration de base du quartz dans le fichier de configuration, ainsi que les informations sur les tâches et les déclencheurs sont-elles chargées ? Ce processus se produit IScheduler sched = sf.GetScheduler(); process, principalement reflété dans la section du code source


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

Grâce à l'analyse du code ci-dessus, l'initialisation vérifiera d'abord s'il existe un nœud de section de configuration 9b4c701a111f87c1cd1643746af7699b dans la configuration du système (config fait référence à app.config, web.config). Si la configuration du système a un nœud de quartz, chargez les informations de configuration directement ici. Si la configuration système ne dispose pas des informations de configuration de base de quartz, elle continuera à rechercher l'existence des deux fichiers de configuration quartz.config/Quartz.quartz.config. Si tel est le cas, les informations de configuration seront chargées. une exception de configuration d'initialisation sera levée.

Et jobs.xml (tâche planifiée et fichier de configuration du nœud du plugin de déclenchement)

Configuration du plugin App.config/web.config


 <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>

La configuration du plugin dans quartz.config pointe vers (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. Méthode basée sur le code

Cette situation est réalisée directement via le code De nombreuses DEMO officielles sont comme ça


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 -----------------");
  }
 }
}
<.>En fait, la méthode code a été mélangée avec le fichier de configuration. Mais cette méthode consiste à charger le travail et à déclencher la configuration via une association de configuration. Nous avons également une troisième méthode, qui consiste à charger le travail et à déclencher les fichiers de configuration nous-mêmes.

3. Chargez manuellement le fichier de configuration


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();
   
  }
 }
}
Ou ceci :


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();
   
  }
 }
}
Actuellement, sur la base de l'analyse du code source, il existe à peu près ces méthodes de configuration, qui sont très flexibles et peuvent être combinées de n'importe quelle manière. Le code source d'utilisation du quartz est très détaillé et il existe de nombreux articles d'apprentissage dans le jardin.

Rappelez-vous que la méthode de lecture de la configuration du quartz est d'abord app.config/web.config ---->quartz.config/Quartz.quartz.config ---->quartz_jobs.xml .

Grâce au code, nous pouvons changer le point de quartz_jobs.xml vers le fichier XML nouvellement nommé

(Le quartz_jobs.xml par défaut est spécifié dans XMLSchedulingDataProcessor.QuartzXmlFileName = "quartz_jobs.xml")

Méthode 1, pointez vers le jobs.xml spécifié via quartz node/quartz.config.

Méthode 2, chargez le fichier jobs.xml spécifié via XMLSchedulingDataProcessor

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn