我心中的核心组件(可插拔的AOP)~调度组件quartz.net
quartz.net是一个任务调度组件,它可以灵活的设置你的调试方式,按时间,按日期,按周期都可以很容易的实现,quartz不仅可以用在web中,而且还可以部署在winform,winservice上,下面我们就来作一个简单的调试服务,我们以WEB环境为例,WEB端采用比较流行的MVC3实现。
首先需要引入三个组件DLL
C5.DLL,log4net.DLL,Quartz.DLL,Common.Logging
对于WEB项目来说,调度的注入后我们可以放在global.asax里,它可以使我们的调度任务在应用程序启动时自动启动,在应用程序结束时,自动结束,这是我们需要看到的。
global.asax内容:
IScheduler sched; protected void Application_Start() { AreaRegistration.RegisterAllAreas(); // 默认情况下对 Entity Framework 使用 LocalDB Database.DefaultConnectionFactory = new SqlConnectionFactory(@"Data Source=(localdb)\v11.0; Integrated Security=True; MultipleActiveResultSets=True"); RegisterGlobalFilters(GlobalFilters.Filters); RegisterRoutes(RouteTable.Routes); log4net.Config.XmlConfigurator.Configure(); string cronExpr = ConfigurationManager.AppSettings["cronExpr"]; ISchedulerFactory sf = new Quartz.Impl.StdSchedulerFactory(); sched = sf.GetScheduler(); IJobDetail job = JobBuilder.Create<Callback>() .WithIdentity("job1", "group1") .Build(); ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create() .WithIdentity("trigger1", "group1") .WithCronSchedule(cronExpr) .Build(); sched.ScheduleJob(job, trigger); sched.Start(); } protected void Application_End(object sender, EventArgs e) { // 在应用程序关闭时运行的代码 if (sched != null) { sched.Shutdown(true); } }
再看我们的调度代码,即调试的回调方法,它必须要实现IJob接口,这个接口只有一个方法Execute,我们把要做的事件写在这里即可,而它有一个参数IJobExecutionContext,它所传入的是当前任务(job)的对象。
public class Callback : IJob { private readonly ILog logger = LogManager.GetLogger(typeof(Callback)); #region IJob 成员 public void Execute(IJobExecutionContext context) { logger.Info(context.JobDetail.Key.Name + DateTime.Now); } #endregion }
下面我们再来看一下配置文件里的相关信息,它由quartz节点和log4日志配置节点组成
<configSections> <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> <section name="quartz" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089"/> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> </configSections> <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"/> </quartz> <log4net> <appender name="InfoFileAppender" type="log4net.Appender.RollingFileAppender"> <file value="./log/" /> <appendToFile value="true" /> <param name="DatePattern" value="yyyyMMdd".txt"" /> <rollingStyle value="Date" /> <maxSizeRollBackups value="100" /> <maximumFileSize value="1024KB" /> <staticLogFileName value="false" /> <Encoding value="UTF-8" /> <filter type="log4net.Filter.LevelRangeFilter"> <param name="LevelMin" value="INFO" /> <param name="LevelMax" value="INFO" /> </filter> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date %-5level %logger - %message%newline" /> </layout> </appender> <root> <level value="INFO" /> <appender-ref ref="InfoFileAppender" /> </root> </log4net> <appSettings> <add key="cronExpr" value="0/100 * * * * ?"/> <!-- 100秒钟执行一次--> </appSettings>
好了,现在我们就可以运行WEB项目了,这时你的根目录的log目录下应该已经有我们的调度日志了,呵呵。