自建定时任务,作业调度框架

2019-12-02 18:41 来源:未知

在我们一贯项目中一时会蒙受按期职分,比方准时同步数据,依期备份数据,定期计算数据等,依期职分大家都掌握使用Quartz.net,此类别写的也是Quartz,不过以前,大家先用其余艺术做个简易的依期职责张开入门。

注:近来英特网海人民广播广播台湾大学介绍Quartz.net的小说,以致Quartz.net官英特网的Tutorial都以1.0版本的,而以此类型在2.0本子对品种举办了比极大面积的改良,使得本来的浩大事例都不可能运作,故写此文。由于自个儿是边学边用,加之本领写作水平都有限,错误自然难于避免,望轻拍,小编将不允许时更新完善此贴,希望能为必要的爱侣提供增派。

第风流倜傥呢,我们今日友好先写一个粗略的准时循环义务,话相当的少说,直接上代码:

1. 类型介绍

率先步:创设项目,新建叁个类库:大家命名称叫TaskBase

     现今的类别,业务数据是更大,守旧的一路管理方式临时候已经无法满意客户需要,依期后台服务这种异步数据管理情势则日渐被世家选拔。相信大家在平时的干活中也时常遇上数据同步,或是依期邮件,短信唤醒等须要,Quartz.net(官方网址 )能够很好满足对四个windows服务的管理及监督,同不经常候在有限支撑支付简单的场地下不失灵活,是极度精美的学业调治框架。

其次部:加多多少个空洞幼功类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(泛型集合类)

 注:此准期任务根底类 是用 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(日志记录-通用日志接口达成)

其三部:增加贰个世袭BaseMonitor的TestMontior类,代码如下:

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

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,商业友好,使用者能够修正源码用于开源或买卖项目,只需包蕴许可及订正表达。

注: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

  Scheduler  ---------主调整程序 --------- Quartz主旨

准期职责的底蕴类库已经创办完成,上面大家来看怎么接受它。

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

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

  Trigger     ---------触发器  --------- 服务实施尺度(什么日期实践操作)

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站点,查看日志如下:

  明白了那些概念之后,大家就足以组合这么些概念并整理出开采的思路:

图片 2

  先接受SchedulerFactory创设二个Scheduler,运维Scheduler,之后塑造Job和Trigger,若有作业监听供给,在Listener上加多相应的管理程序,再将Job和Trigger关联后放入Scheduler

能够看看生龙活虎分钟实行一遍,因为大家在GlobalConfig.TestMonitorInterval设置的正是生龙活虎分钟。

3. Quartz.net的归纳利用

上面大家看怎么在windows server中怎么样使用:

               1. 新建三个调整台程序,引用Quartz.dll和Common.Logging.dll

成立一个WindowsServerTest类库,援用TaskBse,增添七个windows服务:

               2. 新建一个类,命名称叫SampleJob,世襲并促成接口Quartz.IJob         

using Quartz;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading.Tasks;

namespace WindowsServerTest
{
    partial class TestService : ServiceBase
    {
        public TestService()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            try
            {
                // TODO: 在此处添加代码以启动服务。
                PCore.Log.LogTextHelper.WriteLog("OnStart:Test服务开始...");

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




            }
            catch (Exception ex)
            {
                PCore.Log.LogTextHelper.WriteErrorLog("出错了",ex);
            }
        }

        protected override void OnStop()
        {

            // TODO: 在此处添加代码以执行停止服务所需的关闭操作。
            PCore.Log.LogTextHelper.WriteLog("OnStop:Test服务结束...");
        }
        protected override void OnPause()
        {
            PCore.Log.LogTextHelper.WriteLog("OnPause:Test服务暂停...");
        }
        protected override void OnContinue()
        {
            PCore.Log.LogTextHelper.WriteLog("OnContinue:Test服务继续...");
        }
    }
}

图片 3图片 4View Code

关于windows服务的安装卸载可自行百度,再此十分少哔哔了。

public class SampleJob : IJob
    {
        public void Execute(IJobExecutionContext context)
        {
            File.AppendAllText("C:\Quartz.txt", "SampleJob Is Run");
            File.AppendAllText("C:\Quartz.txt", Environment.NewLine);  
        }
    }

安装好服务开端后,大家查阅下日志如下:

              3.在Program.cs的main方法中写如下代码后运营这一个决定台会程序会开采早就SampleJob中的Execute方法已经实行

 图片 5

 

 

图片 6图片 7View Code

此节中我们简要做了三个定时义务,下章大家将拓宽Quartz.net职分框架的牵线。(源代码会跟随前边的例证意气风发并上传卡塔尔国,请继续关怀之后章节。

  ISchedulerFactory  factory = new StdSchedulerFactory();
            IScheduler scheduler = factory.GetScheduler();
            scheduler.Start();
            IJobDetail job = JobBuilder.Create<SampleJob>().WithIdentity("SampleJob", "JobGroup1").Build();
            ITrigger trigger = TriggerBuilder.Create().StartNow().Build();
            scheduler.ScheduleJob(job, trigger);

 

4. 使用topshelf创建WINDOWS服务

      注:此部分张善友同学早就写过 (),此节为担保思路连贯,简要介绍并引用部分代码**  

  也会有的网上朋友会疑问,以调节台程序充任服务宿主还从未意思的,那时候轮到Topshelf出场了, 使用它能够很有利的营造跨平台服务寄主,而在调试时一贯以调节台的样式运行就可以,极度常有助于。 我们引进topshelf.dll及 log4net.dll(topshelf要求卡塔尔,将事前main中代码放到服务类里,把main方法成为Host创设

             服务类代码:

图片 8图片 9View Code

  public class SampleService
    {
        ISchedulerFactory factory;
        IScheduler scheduler;
        public void Start()
        {
            File.AppendAllText("C:\Quartz.txt", "SampleService Is Run");
            File.AppendAllText("C:\Quartz.txt", Environment.NewLine);
            factory = new StdSchedulerFactory();
            scheduler = factory.GetScheduler();
            scheduler.Start();
            IJobDetail job = JobBuilder.Create<SampleJob>().WithIdentity("SampleJob", "JobGroup1").Build();
            ITrigger trigger = TriggerBuilder.Create().StartNow().Build();          
            scheduler.ScheduleJob(job, trigger);
        }
        public void Stop()
        {
            scheduler.Clear();
            File.AppendAllText("C:\Quartz.txt", "SampleService Is Stop");
            File.AppendAllText("C:\Quartz.txt", Environment.NewLine);
        }
    }

 

            更正后的Main代码

图片 10图片 11View Code

        static void Main(string[] args)
        {
            var host = HostFactory.New(x =>
            {
                x.EnableDashboard(); x.Service<SampleService>(s =>
{
    s.SetServiceName("SampleService"); s.ConstructUsing(name => new SampleService());
    s.WhenStarted(tc => { tc.Start(); });
    s.WhenStopped(tc => tc.Stop());
});
                x.RunAsLocalSystem();
                x.SetDescription("SampleService Description");
                x.SetDisplayName("SampleService");
                x.SetServiceName("SampleService");
            });
            host.Run();

        }

 

            编写翻译后,cmd进到exe所在目录,并实践"项目名.exe install/uninstall" 达成服务的装置与卸载

 

TAG标签:
版权声明:本文由金沙澳门唯一官网发布于编程教学,转载请注明出处:自建定时任务,作业调度框架