zoukankan      html  css  js  c++  java
  • Quartz.Net实现定时任务调度

    Quartz.Net实现定时任务调度

     

    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&quot;.log&quot;"/>
          <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);
  • 相关阅读:
    学期总结
    第一次博客作业
    C语言博客作业08
    C语言博客作业07
    C语言博客作业06
    C语言博客作业05
    c语言l博客作业04
    C语言II博客作业04
    C语言II博客作业03
    C语言II博客作业02
  • 原文地址:https://www.cnblogs.com/zxtceq/p/8286877.html
Copyright © 2011-2022 走看看