이 글은 주로 Quartz.Net 스케줄링 프레임워크의 구성 방법을 자세히 소개합니다. 관심 있는 친구들은 이를 참고할 수 있습니다.
일상 업무에서는 대부분의 사람들이 예약된 작업을 수행한 것으로 추정됩니다. 예약된 폴링 데이터베이스 동기화, 예약된 이메일 알림 등 모든 사람들은 Windows 예약 작업, Windows 서비스 등을 통해 이러한 작업을 구현했으며 심지어 자신만의 사용자 정의 구성 프레임워크를 구현했습니다. 그래서 오늘은 오픈 소스 스케줄링 프레임워크인 Quartz.Net을 소개하겠습니다(친구가 이런 질문을 해서 주로 구성 구현을 소개합니다). 스케줄링 구현 코드는 매우 간단합니다. 소스 코드에는 많은 데모가 있으므로 여기서는 생략하겠습니다.
Quartz.Net의 최신 버전은 Quartz.NET 2.0 베타 1 출시
1. 파일 기반 구성
먼저 간단한 구현 코드를 살펴보겠습니다
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); } } }
코드는 매우 간단합니다. , 구성 파일의 quartz 기본 구성, 작업 및 트리거 정보는 어떻게 로드됩니까? 이 프로세스는 IScheduler sched = sf.GetScheduler();에서 발생하며 이는 주로 소스 코드에 반영됩니다. 위의 코드 분석을 통해 초기화에서는 먼저 시스템 구성에 9b4c701a111f87c1cd1643746af7699b 구성 섹션 노드가 있는지 확인합니다. app.config, web.config) 시스템 구성에 석영 노드가 있는 경우 여기에 있는 구성 정보가 직접 로드됩니다. 시스템 구성에 quartz의 기본 구성 정보가 없으면 quartz.config/Quartz.quartz.config라는 두 구성 파일이 있는지 계속해서 찾습니다. 그렇지 않은 경우 구성 정보가 로드됩니다. 초기화 구성 예외가 발생합니다.
app.config/web.config
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)); }quartz.config는 (quartz.plugin.xml.type/quartz를 가리킵니다. .plugin.xml.fileNames)
<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>
두 번째, 코드 기반 접근
이 상황은 코드를 통해 직접적으로 구현되는데, 많은 공식 DEMO가 이런데, 예를 들어보겠습니다
# 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사실 , 코드 방법이 구성 파일과 혼합되었습니다. 하지만 이 방법은 구성 연결을 통해 작업 및 트리거 구성을 로드하는 것입니다. 또한 작업 및 트리거 구성 파일을 직접 로드하는 세 번째 방법도 있습니다.
3 구성 파일을 수동으로 로드
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 -----------------"); } } }또는 이
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(); } } }현재 소스 코드 분석을 기반으로 대략 다음과 같은 구성 방법이 있으며 매우 유연하고 어떤 경우에도 결합할 수 있습니다. 방법. 석영을 사용하기 위한 소스코드가 매우 상세하고, 정원에 학습글도 많이 있습니다. quartz 우선 app.config/web.config ---->quartz.config/Quartz.quartz.config ---->quartz_jobs.xml의 구성 읽는 방법을 기억하세요.
코드를 사용할 수 있습니다. quartz_jobs.xml의 포인트를 새로 명명된 xml 파일
(기본 quartz_jobs.xml은 XMLSchedulingDataProcessor.QuartzXmlFileName = "quartz_jobs.xml"에 지정됨)
방법 1, quartz node/quartz.config 포인터 작업을 통해 지정합니다. xml.
방법 2, XMLSchedulingDataProcessor를 통해 지정된 jobs.xml을 로드합니다.
위 내용은 Quartz.Net 스케줄링 프레임워크 구성 예에 대한 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!