Quartz.Net实现定时任务调度

justatest 9年前

来自: http://www.cnblogs.com/liuchang/p/5179996.html

Quartz.Net介绍:

Quartz一个开源的作业调度框架,OpenSymphony的开源项目。Quartz.Net 是Quartz的C#移植版本。

它一些很好的特性:

1:支持集群,作业分组,作业远程管理。

2:自定义精细的时间触发器,使用简单,作业和触发分离。

3:数据库支持,可以寄宿Windows服务,WebSite,winform等。

基础概念:

Scheduler     作业度器。

IJob             作业接口。 继承并实现Execute, 编写执行的具体作业逻辑。

JobBuilder       根据设置,生成一个详细作业信息(JobDetail)。

TriggerBuilder   根据规则,生产对应的Trigger

应用:

1创建mvc项目,并通过nuget获取Quartz的类库

2封装任务工厂

   /// <summary>          /// 任务工厂          /// </summary>          /// <typeparam name="T">工作类</typeparam>          /// <param name="DetailName">工作名称</param>          /// <param name="TriggerName">触发器名称</param>          /// <param name="Minute">多长时间出发一次</param>          private static void JobsFactory<T>(string DetailName, string TriggerName, int Minute)              where T : IJob          {              //工厂1                ISchedulerFactory factory = new StdSchedulerFactory();                //启动                IScheduler scheduler = factory.GetScheduler();                scheduler.Start();                //描述工作                IJobDetail jobDetail = new JobDetailImpl(DetailName, null, typeof(T));                //触发器                ISimpleTrigger trigger = new SimpleTriggerImpl(TriggerName,                    null,                    DateTime.Now,                    null,                    SimpleTriggerImpl.RepeatIndefinitely,                    TimeSpan.FromSeconds(Minute));                //执行              scheduler.ScheduleJob(jobDetail, trigger);          }

3创建工作内容并实现Ijob的接口

 public class CancleOrderJob : IJob      {          B_Order_ConfrimCancelInfoManager manager = new B_Order_ConfrimCancelInfoManager();          public void Execute(IJobExecutionContext context)          {              log4net.ILog logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);              var list = manager.GetAllHandleOrder();              if (list != null)              {                  foreach (var item in list)                  {                      if (item.GHandleTime < DateTime.Now)                      {                          try                          {                              manager.UpdateStatus(item.ID);                          }                          catch (Exception e)                          {                              logger.Error(e.Message);                              throw;                          }                        }                  }              }          }      }

在global中启动任务:

  protected void Application_Start()          {              AreaRegistration.RegisterAllAreas();                WebApiConfig.Register(GlobalConfiguration.Configuration);              FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);              RouteConfig.RegisterRoutes(RouteTable.Routes);              BundleConfig.RegisterBundles(BundleTable.Bundles);              //自动取消订单              JobsFactory<CancleOrderJob>("CancleOrderDetial", "CancleOrderTrigger", 1000);              //自动完成订单              JobsFactory<CompleteOrderJob>("CompleteOrderDetial", "CompleteOrderTrigger", 1000);              //加载日志的配置文件              log4net.Config.XmlConfigurator.Configure(new FileInfo(Server.MapPath("~/Web.config")));          }

注意:这里用到了log4.net记录错误日志

log4.net记录错误日志的使用方法:

1应用log4.net的类库

2编写配置文件

 <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="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,     log4net"/>    </configSections>
 <log4net debug="true">      <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">        <param name="File" value="log//error_"/>        <param name="AppendToFile" value="true"/>        <param name="MaxSizeRollBackups" value="10"/>        <param name="StaticLogFileName" value="false"/>        <param name="DatePattern" value="yyyy-MM-dd".log""/>        <param name="RollingStyle" value="Date"/>        <layout type="log4net.Layout.PatternLayout">          <param name="ConversionPattern" value="%d - %m%n"/>        </layout>      </appender>      <root>        <level value="DEBUG"/>        <appender-ref ref="RollingLogFileAppender"/>      </root>

3在global中读取配置文件的信息

//加载日志的配置文件              log4net.Config.XmlConfigurator.Configure(new FileInfo(Server.MapPath("~/Web.config")));

4使用:

log4net.ILog logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);  logger.Error(e.Message);