本文共 5617 字,大约阅读时间需要 18 分钟。
在之前的博客中,介绍过Quartz任务调度框架(Java版本)。最近在.NET平台使用了Quartz任务调度框架,并且结合TopShelf框架,把Quartz发布成Windows Service。
今天把示例贴出来,作为自己学习的记录,如果对读者有所帮助,幸甚至哉!
1.资源
1)Quartz 类库
2)TopShelf/TopShelf.Log4Net
3)Common.Logging/Common.Logging.Core/Common.Logging.Log4Net
2.Jobs
1)FirstJob
using log4net;using Quartz;using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace QuartzDemo.QuartzJobs{ public sealed class FirstJob : IJob { private readonly ILog _logger = LogManager.GetLogger(typeof(FirstJob)); public void Execute(IJobExecutionContext context) { _logger.InfoFormat("FirstJob executed successfully."); } }}2)SecondJob
using log4net;using Quartz;using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace QuartzDemo.QuartzJobs{ public sealed class SecondJob : IJob { private readonly ILog _logger = LogManager.GetLogger(typeof(SecondJob)); public void Execute(IJobExecutionContext context) { _logger.InfoFormat("SecondJob executed successfully."); } }}3.配置Jobs
4.quartz.configtrue FirstJob First First Job Test QuartzDemo.QuartzJobs.FirstJob,QuartzDemo true false FirstJobTrigger First FirstJob First 2015-01-22T00:00:00+08:00 0/5 * * * * ? SecondJob Second Second Job Test QuartzDemo.QuartzJobs.SecondJob,QuartzDemo true false SecondJobTrigger Second SecondJob Second 2015-01-22T00:00:00+08:00 0/3 * * * * ?
# You can configure your scheduler in either5.TopShelfconfiguration section# or in quartz properties file# Configuration section has precedencequartz.scheduler.instanceName = QuartzTest# configure thread pool infoquartz.threadPool.type = Quartz.Simpl.SimpleThreadPool, Quartzquartz.threadPool.threadCount = 10quartz.threadPool.threadPriority = Normal# job initialization plugin handles our xml reading, without it defaults are usedquartz.plugin.xml.type = Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin, Quartzquartz.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
服务有启动,停止,继续,暂停等动作,我们使用TopShelf框架很方便地实现。
using Quartz;using Quartz.Impl;using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using Topshelf;namespace QuartzDemo{ public sealed class ServiceRunner : ServiceControl, ServiceSuspend { private readonly IScheduler scheduler; public ServiceRunner() { scheduler = StdSchedulerFactory.GetDefaultScheduler(); } public bool Start(HostControl hostControl) { scheduler.Start(); return true; } public bool Stop(HostControl hostControl) { scheduler.Shutdown(false); return true; } public bool Continue(HostControl hostControl) { scheduler.ResumeAll(); return true; } public bool Pause(HostControl hostControl) { scheduler.PauseAll(); return true; } }}6.Log4Net配置
7.TopShelf启动
using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Text;using System.Threading.Tasks;using Topshelf;namespace QuartzDemo{ class Program { static void Main(string[] args) { var fileInfo = new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "log4net.config"); log4net.Config.XmlConfigurator.ConfigureAndWatch(fileInfo); HostFactory.Run(x => { x.RunAsLocalSystem(); x.Service8.效果(); x.SetDescription("QuartzDemo服务描述"); x.SetDisplayName("QuartzDemo服务显示名称"); x.SetServiceName("QuartzDemo服务名称"); x.EnablePauseAndContinue(); }); } }}
安装十分简单,在DOS(系统管理员身份启动)环境下,切换到QuartzDemo.exe所在目录
QuartzDemo.exe install服务安装后并启动后如下: