9159金沙游艺场

图片 4
开始使用Web Workers
图片 4
[原创]KVM虚拟化管理平台的实现

.NET 任务调度Quartz系列(1)——自建定时任务

在我们平时项目中经常会遇到定时任务,比如定时同步数据,定时备份数据,定时统计数据等,定时任务我们都知道使用Quartz.net,此系列写的也是Quartz,但是在此之前,我们先用其他方式做个简单的定时任务进行入门。

注:目前网上诸多介绍Quartz.net的文章,甚至Quartz.net官网上的Tutorial都是1.0版本的,而这个项目在2.0版本对项目进行了比较大规模的修改,使得原有的很多例子都不能运行,故写此文。由于本人是边学边用,加之技术写作水平皆有限,错误自然难免,望轻拍,我将不定时更新完善此贴,希望能为需要的朋友提供帮助。

我们通常在一些情况下需要软件具有一个自动执行某些任务的功能,但是又不希望直接启动软件,或者每次都要手动的来启动软件,这时我们可可以考虑到windows服务了。

首先呢,我们现在自己先写一个简单的定时循环任务,话不多说,直接上代码:

9159金沙游艺场,1. 项目介绍

首先创建一个windows服务项目(详细信息请参阅:C#创建Windows
Service(Windows
服务)基础教程

第一步:创建项目,新建一个类库:我们命名为TaskBase

    
现今的系统,业务数据是越来越大,传统的同步处理方式有时候已经不能满足用户需求,定时后台服务这种异步数据处理形式则逐渐被大家接受。相信大家在平时的工作中也经常遇到数据同步,或是定时邮件,短信提醒等需求,Quartz.net(官网
)可以很好满足对多个windows服务的管理及监控,同时在保证开发简单的情况下不失灵活,是非常优秀的作业调度框架。

    9159金沙游艺场 1

第二部:添加一个抽象基础类BaseMonitor:

和其他绝大多数开源项目一样Quartz.net也包含了其他几个优秀的开源项目:

在创建好的项目中点击“单击此处切换到代码视图”切换到代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TaskBase
{
    /// <summary>
    /// 监测基础抽象类
    /// </summary>
    public abstract class BaseMonitor
    {

        protected System.Threading.Thread _thread;
        /// <summary>
        /// 监控时间间隔(毫秒)
        /// </summary>
        public virtual int Interval { get; set; }

        public virtual string Name { get; set; }
        /// <summary>
        /// 监控器状态
        /// </summary>
        public virtual TaskState State { get; set; }
        public BaseMonitor(string name)
        {
            Name = name;
            _thread = new System.Threading.Thread(BaseRun);
            _thread.IsBackground = true;//获取或设置一个值,该值指示某个线程是否为后台线程
            _thread.Start();
            State = TaskState.运行;
        }
        private void BaseRun()
        {          
            while (State==TaskState.运行)
            {
                try
                {
                    Run();
                    System.Threading.Thread.Sleep(Interval);
                }
                catch (Exception ex)
                {
                    State = TaskState.异常;
                    PCore.Log.LogTextHelper.WriteErrorLog(this.GetType().Name + "监控出现错误,此监视器已暂停!", ex);
                }
            }
        }
        protected virtual void Run()
        { }
    }
}

核心   —-Common.Logging(通用日志接口)

我们主要关注一下两个方法:

(代码中PCore.Log.LogTextHelper.WriteErrorLog
是一个写文本日志的方法,可自行写个此方法。)

         —-C5(泛型集合类)

  • OnStart – 控制服务启动
  • OnStop – 控制服务停止

 注:此定时任务基础类 是用 System.Threading.Thread
实现,其中 TaskState为一个枚举来表示任务的状态:

示例程序

  例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TaskBase
{
   public enum TaskState
    {
        未开始=0,
        运行=1,
        暂停=2,
        异常=3
    }
}

         —-log4net(日志记录-通用日志接口实现)

9159金沙游艺场 29159金沙游艺场 3

第三部:添加一个继承BaseMonitor的TestMontior类,代码如下:

         —-topshelf(跨平台服务宿主程序)

 1     public partial class Service1 : ServiceBase
 2     {
 3         public Service1()
 4         {
 5             InitializeComponent();
 6         }
 7 
 8         protected override void OnStart(string[] args)
 9         {
10             //todo:这里是服务启动所执行的代码
11         }
12 
13         protected override void OnStop()
14         {
15             //todo:这里是服务停止所执行的代码
16         }
17     }
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TaskBase
{
   public class TestMontior:BaseMonitor
    {
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="name">检测器名称</param>
        public TestMontior(string name) : base(name)
        {
        }
        /// <summary>
        /// 监控时间间隔(毫秒)
        /// </summary>
        public override int Interval
        {
            get
            {
              return  GlobalConfig.TestMonitorInterval;
            }          
        }
        public override string Name
        {
            get
            {
                return base.Name;
            }

            set
            {
                base.Name = value;
            }
        }

        public override TaskState State
        {
            get
            {
                return base.State;
            }

            set
            {
                base.State = value;
            }
        }
        protected override void Run()
        {          
            PCore.Log.LogTextHelper.WriteLog("TestMontitor监测器正在监测");
        }
    }
}

  Quartz.net使用的许可是Apache
License,商业友好,使用者可以修改源码用于开源或商业项目,只需包含许可及修改说明。

View Code

注:TestMontior
相当于我们的Job,代码中 GlobalConfig是我定义的一个全局参数类:

2. Quartz.net开发思路

 下面我们可以写一个定时任务的功能了:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TaskBase
{
   public static class GlobalConfig
    {
        public static int TestMonitorInterval
        {
            get { return 100 * 10; }
        }

        public static List<BaseMonitor> Monitor = new List<BaseMonitor>();
    }
}

 

  

创建完成之后就是这个样子:

  我们来了解下Quartz.net中常用的几个概念:

 1      private void StartDoSomething()
 2         {
 3             System.Timers.Timer timer = new System.Timers.Timer(10000); //间隔10秒
 4             timer.AutoReset = true;
 5             timer.Enabled = false;  //执行一次
 6             timer.Elapsed += new ElapsedEventHandler(ExecutionCode);
 7             timer.Start();
 8         }
 9 
10         private void ExecutionCode(object source, System.Timers.ElapsedEventArgs e)
11         {
12             string dtNow = DateTime.Now.ToString("HH:mm");
13             if (dtNow == "12:00")
14             {
15                 File.WriteAllText("D:/ExecutionService.txt", "服务执行了一次任务", Encoding.UTF8);
16             }
17         }

9159金沙游艺场 4

  Scheduler  ———主调度程序 ——— Quartz核心

然后在OnStart的方法中调用上面的StartDoSomething的方法

定时任务的基础类库已经创建完毕,下面我们来看怎么使用它。

  Job        ———作业  ——— 服务要做的(业务操作)

1         protected override void OnStart(string[] args)
2         {
3             StartDoSomething();
4         }    

 第四部:在WEB中使用:创建一个WEB 
MVC项目,引用TaskBase,然后在Global.asax中添加以下代码:

  Trigger     ———触发器  ——— 服务执行条件(何时执行操作)

以上就可以算是一个简单的定时执行任务的windows服务了,这里我们还可以使用Quartz.Net来实现更加强大的任务调度功能。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;

namespace WebTaskTest
{
    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);


           TaskBase.GlobalConfig.Monitor.Add(new TaskBase.TestMontior("测试监控器Test"));//注册定时任务


        }
    }
}

  Listener    ———事件监听器  ——— 执行期事件(Job执行前后/
Scheduler启动终止暂停时应该做什么,可以挂一些特定事件)

 

运行WEB站点,查看日志如下:

  了解了这些概念之后,我们就可以组合这些概念并整理出开发的思路:

首先来介绍一下Quartz.Net这个框架:

9159金沙游艺场 5

 
先利用SchedulerFactory构建一个Scheduler,启动Scheduler,之后构建Job和Trigger,若有作业监听需求,在Listener上添加相应的处理程序,再将Job和Trigger关联后放入Scheduler

  简介:Quartz.Net是一个开源的任务调度框架,非常强大,能够通过简单的配置帮助我们定时具体的操作。相对于我们用的线程里面while(true)然后sleep来执行某个操作,应该算的上是高端,大气,上档次了。目前最新版本是2.2,新的版本里面有些方法名发生了变化,从之前的版本用过来的人应该会有体会.这里我使用最常用,也是最稳定的方式–Windows服务里面使用Quartz.net,并且使用配置的方式来设置触发器。(以上内容摘自网络)

相关文章

No Comments, Be The First!
近期评论
    功能
    网站地图xml地图