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);
  • 相关阅读:
    解决ListView异步加载数据之后不能点击的问题
    android点击实现图片放大缩小 java技术博客
    关于 数据文件自增长 的一点理解
    RAC 实例不能启动 ORA1589 signalled during ALTER DATABASE OPEN
    Linux 超级用户的权利
    RAC 实例 迁移到 单实例 使用导出导入
    Shell 基本语法
    Linux 开机引导与关机过程
    RAC 实例不能启动 ORA1589 signalled during ALTER DATABASE OPEN
    Oracle RAC + Data Guard 环境搭建
  • 原文地址:https://www.cnblogs.com/zxtceq/p/8286877.html
Copyright © 2011-2022 走看看