一、Quartz.Net介绍
Quartz.NET是一个开源的作业调度框架,非常适合在平时的工作中,定时轮询数据库同步,定时邮件通知,定时处理数据等。 Quartz.NET允许开发人员根据时间间隔(或天)来调度作业。它实现了作业和触发器的多对多关系,还能把多个作业与不同的触发器关联。整合了 Quartz.NET的应用程序可以重用来自不同事件的作业,还可以为一个事件组合多个作业。在我平时的工作中对于Quartz的使用比较频繁,正好利用空闲时间把这个做一个记录。
二、快速搭建
1.利用VS创建一个控制台的项目
2.利用NuGet工具包安装所需要的依赖包
3.首先安装:Quartz,这里选择我的项目一直在用的2.6的版本,目前为止最新的已经到了3.x
安装完成之后在引用里面会多了一些新的引用
4.安装我们的日志依赖包:log4net
5.安装搭建服务用的:Topshelf 以及其所依赖的 Topshelf.Log4Net
至此,所用到的包基本已经安装完毕,下面是添加三个程序文件和三个配置文件。
6.添加我们的测试程序文件:JobTest.cs,该文件实现Quartz的IJob接口
1 using System; 2 using log4net; 3 using Quartz; 4 5 namespace JobTest 6 { 7 public class TestJob : IJob 8 { 9 private readonly ILog _logger = LogManager.GetLogger(typeof(TestJob)); 10 public void Execute(IJobExecutionContext context) 11 { 12 _logger.InfoFormat("测试输出"); 13 } 14 } 15 } JobTest7.添加用于Topshelf调度的文件:ServiceRunner.cs
1 using Quartz; 2 using Quartz.Impl; 3 using Topshelf; 4 5 namespace JobTest 6 { 7 public sealed class ServiceRunner : ServiceControl, ServiceSuspend 8 { 9 private readonly IScheduler scheduler; 10 11 public ServiceRunner() 12 { 13 scheduler = StdSchedulerFactory.GetDefaultScheduler(); 14 } 15 16 public bool Start(HostControl hostControl) 17 { 18 scheduler.Start(); 19 return true; 20 } 21 22 public bool Stop(HostControl hostControl) 23 { 24 scheduler.Shutdown(false); 25 return true; 26 } 27 28 public bool Continue(HostControl hostControl) 29 { 30 scheduler.ResumeAll(); 31 return true; 32 } 33 34 public bool Pause(HostControl hostControl) 35 { 36 scheduler.PauseAll(); 37 return true; 38 } 39 } 40 } ServiceRunner8.添加程序的入口文件:Program.cs
1 using System; 2 using System.Collections.Generic; 3 using System.IO; 4 using System.Linq; 5 using System.Text; 6 using System.Threading.Tasks; 7 using Topshelf; 8 9 namespace JobTest 10 { 11 class Program 12 { 13 static void Main(string[] args) 14 { 15 log4net.Config.XmlConfigurator.ConfigureAndWatch(new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "log4net.config")); 16 HostFactory.Run(x => 17 { 18 x.UseLog4Net(); 19 20 x.Service<ServiceRunner>(); 21 22 x.SetDescription("定时作业"); 23 x.SetDisplayName("JobTest"); 24 x.SetServiceName("JobTest"); 25 26 x.EnablePauseAndContinue(); 27 }); 28 } 29 } 30 } Program.cs9.添加配置文件:log4net.config
1 <?xml version="1.0" encoding="utf-8" ?> 2 <configuration> 3 <configSections> 4 <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> 5 </configSections> 6 7 <log4net> 8 <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> 9 <!--日志路径--> 10 <param name= "File" value= "D:\App_Log\servicelog\JobTest\"/> 11 <!--是否是向文件中追加日志--> 12 <param name= "AppendToFile" value= "true"/> 13 <!--log保留天数--> 14 <param name= "MaxSizeRollBackups" value= "10"/> 15 <!--日志文件名是否是固定不变的--> 16 <param name= "StaticLogFileName" value= "false"/> 17 <!--日志文件名格式为:2008-08-31.log--> 18 <param name= "DatePattern" value= "yyyy-MM-dd".read.log""/> 19 <!--日志根据日期滚动--> 20 <param name= "RollingStyle" value= "Date"/> 21 <layout type="log4net.Layout.PatternLayout"> 22 <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n %loggername" /> 23 </layout> 24 </appender> 25 26 <!-- 控制台前台显示日志 --> 27 <appender name="ColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender"> 28 <mapping> 29 <level value="ERROR" /> 30 <foreColor value="Red, HighIntensity" /> 31 </mapping> 32 <mapping> 33 <level value="Info" /> 34 <foreColor value="Green" /> 35 </mapping> 36 <layout type="log4net.Layout.PatternLayout"> 37 <conversionPattern value="%n