Quartz.Net实现定时任务调度的例子

作者:袖梨 2022-06-25

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

它一些很好的特性:

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

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

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

基础概念:

Scheduler     作业度器。

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

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

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

应用:


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


2封装任务工厂


 ///


        /// 任务工厂
        ///

        /// 工作类
        /// 工作名称
        /// 触发器名称
        /// 多长时间出发一次
        private static void JobsFactory(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("CancleOrderDetial", "CancleOrderTrigger", 1000);
            //自动完成订单
            JobsFactory("CompleteOrderDetial", "CompleteOrderTrigger", 1000);
            //加载日志的配置文件
            log4net.Config.XmlConfigurator.Configure(new FileInfo(Server.MapPath("~/Web.config")));
        }
注意:这里用到了log4.net记录错误日志


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

 

1应用log4.net的类库

 

2编写配置文件


   
   


   

 
 
   
     
     
      ps" value="10"/>
     
     
     
     
       
     

   

   
     
     
   

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);

相关文章

精彩推荐