天天看點

我心中的核心元件(可插拔的AOP)~排程元件quartz.net

回到目錄

quartz.net是一個任務排程元件,它可以靈活的設定你的調試方式,按時間,按日期,按周期都可以很容易的實作,quartz不僅可以用在web中,而且還可以部署在winform,winservice上,下面我們就來作一個簡單的調試服務,我們以WEB環境為例,WEB端采用比較流行的MVC3實作。

首先需要引入三個元件DLL

C5.DLL,log4net.DLL,Quartz.DLL,Common.Logging

對于WEB項目來說,排程的注入後我們可以放在global.asax裡,它可以使我們的排程任務在應用程式啟動時自動啟動,在應用程式結束時,自動結束,這是我們需要看到的。

global.asax内容:

IScheduler sched;
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            // 預設情況下對 Entity Framework 使用 LocalDB
            Database.DefaultConnectionFactory = new SqlConnectionFactory(@"Data Source=(localdb)\v11.0; Integrated Security=True; MultipleActiveResultSets=True");

            RegisterGlobalFilters(GlobalFilters.Filters);
            RegisterRoutes(RouteTable.Routes);

            log4net.Config.XmlConfigurator.Configure();
            string cronExpr = ConfigurationManager.AppSettings["cronExpr"];
            ISchedulerFactory sf = new Quartz.Impl.StdSchedulerFactory();
            sched = sf.GetScheduler();
            IJobDetail job = JobBuilder.Create<Callback>()
                .WithIdentity("job1", "group1")
                .Build();

            ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create()
                .WithIdentity("trigger1", "group1")
                .WithCronSchedule(cronExpr)
                .Build();

            sched.ScheduleJob(job, trigger);
            sched.Start();
        }


        protected void Application_End(object sender, EventArgs e)
        {
            //   在應用程式關閉時運作的代碼
            if (sched != null)
            {
                sched.Shutdown(true);
            }
        }      

再看我們的排程代碼,即調試的回調方法,它必須要實作IJob接口,這個接口隻有一個方法Execute,我們把要做的事件寫在這裡即可,而它有一個參數IJobExecutionContext,它所傳入的是目前任務(job)的對象。

public class Callback : IJob
    {
        private readonly ILog logger = LogManager.GetLogger(typeof(Callback));

        #region IJob 成員

        public void Execute(IJobExecutionContext context)
        {
            logger.Info(context.JobDetail.Key.Name + DateTime.Now);
        }

        #endregion
    }      

下面我們再來看一下配置檔案裡的相關資訊,它由quartz節點和log4日志配置節點組成

<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="quartz" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  </configSections>
  <quartz>
    <add key="quartz.scheduler.instanceName" value="ExampleDefaultQuartzScheduler"/>
    <add key="quartz.threadPool.type" value="Quartz.Simpl.SimpleThreadPool, Quartz"/>
    <add key="quartz.threadPool.threadCount" value="10"/>
    <add key="quartz.threadPool.threadPriority" value="2"/>
    <add key="quartz.jobStore.misfireThreshold" value="60000"/>
    <add key="quartz.jobStore.type" value="Quartz.Simpl.RAMJobStore, Quartz"/>
  </quartz>
  <log4net>
    <appender name="InfoFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="./log/" />
      <appendToFile value="true" />
      <param name="DatePattern" value="yyyyMMdd&quot;.txt&quot;" />
      <rollingStyle value="Date" />
      <maxSizeRollBackups value="100" />
      <maximumFileSize value="1024KB" />
      <staticLogFileName value="false" />
      <Encoding value="UTF-8" />
      <filter type="log4net.Filter.LevelRangeFilter">
        <param name="LevelMin" value="INFO" />
        <param name="LevelMax" value="INFO" />
      </filter>
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date %-5level %logger  - %message%newline" />
      </layout>
    </appender>
    <root>
      <level value="INFO" />
      <appender-ref ref="InfoFileAppender" />
    </root>
  </log4net>
  <appSettings>
    <add key="cronExpr" value="0/100 * * * * ?"/>
    <!-- 100秒鐘執行一次-->
</appSettings>      

好了,現在我們就可以運作WEB項目了,這時你的根目錄的log目錄下應該已經有我們的排程日志了,呵呵。

作者:倉儲大叔,張占嶺,

榮譽:微軟MVP

QQ:853066980

支付寶掃一掃,為大叔打賞!

我心中的核心元件(可插拔的AOP)~排程元件quartz.net