Net作業調度-----Quartz.Net

來源:互聯網
上載者:User

標籤:

一:業務需求:

項目需要在不同時刻,執行一個或很多個不同的作業。

Windows執行計畫這時並不能很好的滿足需求了,迫切需要一個更為強大,方便管理,叢集部署的作業調度架構。

二:介紹

Quartz一個開源的作業調度架構,OpenSymphony的開源項目。Quartz.Net 是Quartz的C#移植版本。

特性:

1:支援叢集,作業分組,作業遠端管理。 

2:自訂精細的時間觸發器,使用簡單,作業和觸發分離。

3:資料庫支援,可以寄宿Windows服務,WebSite,winform等。

三:使用的方法:

    1.名詞的解釋:

       Scheduler     作業調度器。

   IJob             作業介面,繼承並實現Execute, 編寫執行的具體作業邏輯。

  JobBuilder       根據設定,產生一個詳細作業資訊(JobDetail)。

  TriggerBuilder   根據規則,生產對應的Trigger

2.學習的官網

    Quartz.Net官方2.X教程  http://www.quartz-scheduler.net/documentation/quartz-2.x/tutorial/index.html

    Quartz.Net開源地址   https://github.com/quartznet/quartznet

3.Nuget安裝

 PM> Install-Package Quartz 

 4.代碼解釋:

using System;using System.Collections.Generic;using System.Linq;using System.Web;using Quartz;using Quartz.Impl;using System.Collections.Specialized;namespace Portal.JobScheduler{    public class QuartzManager<T> where T:class,IJob    {        //發送器的工廠的介面中 執行個體一個具體的調度方法        private static ISchedulerFactory schedulerFactory = new StdSchedulerFactory();        //JOb群組名        private static string JOB_GROUP_NAME = "JOBGROUP_NAME";        //觸發器群        private static string TRIGGER_GROUP_NAME = "TRIGGERGROUP_NAME";               /// <summary>        /// 添加一個定時任務,使用預設的工作群組名,觸發器名,觸發器組名         /// </summary>        /// <param name="pStrJobName">任務名</param>        /// <param name="pStrCronExpress">觸發器運算式</param>        public static void AddJob(string pStrJobName, string pStrCronExpress)        {            try            {                //介面中擷取調度工廠的  GetScheduler()  方法                IScheduler sched = schedulerFactory.GetScheduler();                //建立任務                IJobDetail job = JobBuilder.Create<T>().WithIdentity(pStrJobName, JOB_GROUP_NAME).Build();                //建立觸發器                ITrigger trigger = TriggerBuilder.Create()                    .WithIdentity(pStrJobName, TRIGGER_GROUP_NAME)                    .WithCronSchedule(pStrCronExpress)                    .Build();                sched.ScheduleJob(job, trigger);                sched.Start();            }            catch (Exception e)            {                                throw new Exception(e.Message);            }        }        /// <summary>        /// 移除一個任務(使用預設的工作群組名,觸發器名,觸發器組名)         /// </summary>        /// <param name="pStrJobName"></param>        public static void RemoveJob(string pStrJobName)        {            try            {                 IScheduler sched = schedulerFactory.GetScheduler();                 JobKey jobkey = new JobKey(pStrJobName);                 TriggerKey triggerKey = new TriggerKey(pStrJobName, TRIGGER_GROUP_NAME);                 //停止觸發器                 sched.PauseTrigger(triggerKey);                //移除觸發器                 sched.UnscheduleJob(triggerKey);                //刪除任務                 sched.DeleteJob(jobkey);            }            catch (Exception e)            {                 throw new Exception(e.Message);            }        }        /// <summary>        /// 修改一個任務的觸發時間(使用預設的工作群組名,觸發器名,觸發器組名)         /// </summary>        /// <param name="pStrJobName">任務名</param>        /// <param name="pStrCronExpress">觸發器運算式</param>        public static void ModifyJobTime(string pStrJobName, string pStrCronExpress, IDictionary<string, object> pDictionary)        {            try            {                IScheduler sched = schedulerFactory.GetScheduler();                TriggerKey triggerKey = new TriggerKey(pStrJobName, TRIGGER_GROUP_NAME);                ICronTrigger trigger = (ICronTrigger)sched.GetTrigger(triggerKey);                if (trigger == null)                {                    return;                }                RemoveJob(pStrJobName);                AddJob(pStrJobName, pStrCronExpress);            }            catch (Exception e)            {                throw new Exception(e.Message);            }        }         /// <summary>         ///  開啟所有定時任務         /// </summary>        public static void startJobs()        {            try            {                IScheduler sched = schedulerFactory.GetScheduler();                sched.Start();            }            catch (Exception e)            {                                throw new Exception(e.Message);            }        }        /// <summary>        /// 關閉所有的定時任務        /// </summary>        public static void shutdownJobs()        {            try            {                IScheduler sched = schedulerFactory.GetScheduler();                if (!sched.IsShutdown)                {                    sched.Shutdown();                }            }            catch (Exception e)            {                throw new Exception(e.Message);            }        }        /// <summary>        /// 恢複所有的任務        /// </summary>        public static void ResumeAllJobs()        {            try            {                   IScheduler sched = schedulerFactory.GetScheduler();                   if (!sched.IsShutdown)                   {                       sched.ResumeAll();                   }            }            catch (Exception e)            {                                throw new Exception(e.Message);            }        }        /// <summary>        /// 暫停所有的作業        /// </summary>        public static void PauseAllJobs()        {            try            {                  IScheduler sched = schedulerFactory.GetScheduler();                  sched.PauseAll();            }            catch (Exception e)            {                                throw new Exception(e.Message);            }        }    }}

 Asp。net調用:

在global檔案中進行配置

 private void RegisterJob()        {            QuartzManager<SHiddenDangerCaution>.AddJob("SHiddenDangerCautionInfo", "0 0 08 ? * *");        }

  調度類的寫法:

public class SyncWeatherInfoJob:IJob    {        public void Execute(IJobExecutionContext context)        {            UpdateWeatherForecast();        }        /// <summary>        /// 更新氣象實況資訊        /// </summary>        public void UpdateWeatherForecast()        {            WeatherForecast.InsertWeatherInfo();   --這裡的代碼就不貼出來        }    }

 這樣就完成了調度任務

 

CrystalQuartz 遠端管理

CrystalQuartz開源的地址   https://github.com/guryanovev/CrystalQuartz

但如果想方便的知道某個作業執行情況,需要暫停,啟動等操作行為,這時候就需要個Job管理的介面。

接下來介紹Quartz.NET如何進行遠程job管理,:

代碼:

  一:作業服務端

static void Main(string[] args)       {           var properties = new NameValueCollection();           properties["quartz.scheduler.instanceName"] = "RemoteServerSchedulerClient";            // 設定線程池           properties["quartz.threadPool.type"] = "Quartz.Simpl.SimpleThreadPool, Quartz";           properties["quartz.threadPool.threadCount"] = "5";           properties["quartz.threadPool.threadPriority"] = "Normal";            // 遠程輸出配置           properties["quartz.scheduler.exporter.type"] = "Quartz.Simpl.RemotingSchedulerExporter, Quartz";           properties["quartz.scheduler.exporter.port"] = "556";           properties["quartz.scheduler.exporter.bindName"] = "QuartzScheduler";           properties["quartz.scheduler.exporter.channelType"] = "tcp";            var schedulerFactory = new StdSchedulerFactory(properties);           var scheduler = schedulerFactory.GetScheduler();            var job = JobBuilder.Create<PrintMessageJob>()               .WithIdentity("myJob", "group1")               .Build();            var trigger = TriggerBuilder.Create()               .WithIdentity("myJobTrigger", "group1")               .StartNow()               .WithCronSchedule("/10 * * ? * *")               .Build();           scheduler.ScheduleJob(job, trigger);           scheduler.Start();        }public class PrintMessageJob : IJob   {       public void Execute(IJobExecutionContext context)       {           Console.WriteLine("Hello!");       }   }

 

二:作業遠端管理端,無需寫任何代碼,引用官方程式集,嵌入到已有的web網站。

   PM> Install-Package CrystalQuartz.Remote

 

      Webconfig 需要配置的地方

<configuration>     <crystalQuartz>        <provider>            <add property="Type" value="CrystalQuartz.Core.SchedulerProviders.RemoteSchedulerProvider, CrystalQuartz.Core" />            <add property="SchedulerHost" value="tcp://127.0.0.1:556/QuartzScheduler" /> <!--TCP監聽的地址-->        </provider>     </crystalQuartz><system.webServer>      <!-- Handler攔截處理了,輸出作業監控頁面-->        <handlers>            <add name="CrystalQuartzPanel" verb="*" path="CrystalQuartzPanel.axd" type="CrystalQuartz.Web.PagesHandler, CrystalQuartz.Web" />        </handlers>    </system.webServer></configuration>

 

 

Net作業調度-----Quartz.Net

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.