zoukankan      html  css  js  c++  java
  • 任务调度~Quartz.net实现简单的任务调试

    任务调度类似于sqlserver中的作业,即按周期性执行某个程序,代码段,或者某种服务,在JAVA环境中出现了Quartz,它可以简单的实现任务的调试,而像lucene一样,它会有对于的.net版本,Quartz.net,今天我们来做一个简单的实验,其时很简单的实验:

    环境:.net4.0+mvc3

    功能:每1分钟去向一个文件里写日志(当然,如果你要调用某个服务,只要让它实现IJob接口即可。

    所需要的程序集

    首先在WEB.Config的configuration节点里做一些必要的配置

     1   <configSections>
     2     <section name="quartz" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
     3     <sectionGroup name="common">
     4       <section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging"/>
     5     </sectionGroup>
     6   </configSections>
     7   <common>
     8     <logging>
     9       <factoryAdapter type="Common.Logging.Simple.ConsoleOutLoggerFactoryAdapter, Common.Logging">
    10         <arg key="showLogName" value="true"/>
    11         <arg key="showDataTime" value="true"/>
    12         <arg key="level" value="INFO"/>
    13         <arg key="dateTimeFormat" value="HH:mm:ss:fff"/>
    14       </factoryAdapter>
    15     </logging>
    16   </common>
    17 
    18   <quartz>
    19     <add key="quartz.scheduler.instanceName" value="ExampleDefaultQuartzScheduler"/>
    20 
    21     <add key="quartz.threadPool.type" value="Quartz.Simpl.SimpleThreadPool, Quartz"/>
    22     <add key="quartz.threadPool.threadCount" value="10"/>
    23     <add key="quartz.threadPool.threadPriority" value="2"/>
    24 
    25     <add key="quartz.jobStore.misfireThreshold" value="60000"/>
    26     <add key="quartz.jobStore.type" value="Quartz.Simpl.RAMJobStore, Quartz"/>
    27   </quartz>

    在global.asax.cs里添加调用和取消调用的代码

    1         protected void Application_Start()
    2         {
    3            WriteLogScheduler.Instance.Start();
    4         }
    5 
    6         protected void Application_End(object sender, EventArgs e)
    7         {
    8             WriteLogScheduler.Instance.Stop();
    9         }

    所要调用的任务,它需要实现IJob接口

     1     /// <summary>
     2     /// 要调度的功能模块
     3     /// </summary>
     4     public class WriteLogJob : IJob
     5     {
     6         public void Execute(IJobExecutionContext context)
     7         {
     8             string fileLogPath = AppDomain.CurrentDomain.BaseDirectory;
     9             string fileLogName = "TestQuartz_" + DateTime.Now.ToLongDateString() + "_log.txt";
    10             FileInfo finfo = new FileInfo(fileLogPath + fileLogName);
    11             using (FileStream fs = finfo.OpenWrite())
    12             {
    13                 //根据上面创建的文件流创建写数据流 
    14                 StreamWriter strwriter = new StreamWriter(fs);
    15                 //设置写数据流的起始位置为文件流的末尾 
    16                 strwriter.BaseStream.Seek(0, SeekOrigin.End);
    17                 //写入相关记录信息
    18                 strwriter.WriteLine("发生时间: " + DateTime.Now.ToString());
    19                 strwriter.WriteLine("---------------------------------------------");
    20                 strwriter.WriteLine();
    21                 //清空缓冲区内容,并把缓冲区内容写入基础流 
    22                 strwriter.Flush();
    23                 strwriter.Close();
    24                 fs.Close();
    25             }
    26         }
    27 
    28     }

    添加调用任务的代码,Quartz服务核心代码

     1  public class WriteLogScheduler
     2     {
     3 
     4         static ISchedulerFactory _sf = new StdSchedulerFactory();
     5         static IScheduler _sched = _sf.GetScheduler();
     6         static WriteLogScheduler _instance = null;
     7         static object lockObj = new object();
     8 
     9         /// <summary>
    10         /// 线程安全的单例对象
    11         /// </summary>
    12         public static WriteLogScheduler Instance
    13         {
    14             get
    15             {
    16                 if (_instance == null)
    17                 {
    18                     lock (lockObj)
    19                     {
    20                         if (_instance == null)
    21                         {
    22                             _instance = new WriteLogScheduler();
    23                         }
    24                     }
    25                 }
    26                 return _instance;
    27             }
    28         }
    29 
    30         public void Start()
    31         {
    32             ILog log = LogManager.GetLogger(typeof(WriteLogScheduler));
    33             DateTimeOffset runTime = DateBuilder.EvenMinuteDate(DateTimeOffset.UtcNow);
    34             // define the job and tie it to our HelloJob class
    35             IJobDetail job = JobBuilder.Create<WriteLogJob>()
    36                 .WithIdentity("job1", "group1")
    37                 .Build();
    38             // Trigger the job to run on the next round minute
    39             ITrigger trigger = TriggerBuilder.Create()
    40                 .WithIdentity("trigger1", "group1")
    41                 .StartAt(runTime)
    42                 .Build();
    43             // Tell quartz to schedule the job using our trigger
    44             _sched.ScheduleJob(job, trigger);
    45             _sched.Start();
    46         }
    47         public void Stop()
    48         {
    49             _sched.Shutdown(true);
    50         }
    51 
    52     }

    运行程序,即可看到结果了,下一讲,我将把XML配置信息加进来,以减少程序的松耦性。

  • 相关阅读:
    HDU 5273 Dylans loves sequence 暴力递推
    HDU 5285 wyh2000 and pupil 判二分图+贪心
    HDU 5281 Senior's Gun 贪心
    HDU 5651 xiaoxin juju needs help 逆元
    HDU 5646 DZY Loves Partition
    HDU 5366 The mook jong
    HDU 5391Z ball in Tina Town 数论
    HDU 5418 Victor and World 允许多次经过的TSP
    HDU 5642 King's Order dp
    抽屉原理
  • 原文地址:https://www.cnblogs.com/lori/p/2737562.html
Copyright © 2011-2022 走看看