Quartz在.Net网站中的使用方法(附Demo)

分享到:
  来源:CSDN  发布时间:2013-08-01  浏览次数:4847

  Quartz C#

      现在做一个B/S项目需要用到计划任务,本来想自定写一个的,写了几句,突然想看看网上有没有现成可以用的.
结果在苦寻之下找到了Quartz这个组件.看过之后感觉还不错.决定用它实现计划任务了.
再找找看有没有现成的任务.但找了大半天.大多数都是C/S结构中用的.

于是就把自已的写的Demo放到网上,供大家参考一下,如有不正确之 处,还请大家多多指教!

第一步:
引用三个dll文件:Nullables.dll,Quartz.dll,Common.Logging.dll
没有引用Common.Logging.dll出出错.也没多看,大家可以看一下为什么!

第二步:

配置Web.Config文件

[csharp] view plaincopyprint?
 
  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.   
  8.   <common>  
  9.     <logging>  
  10.       <factoryAdapter type="Common.Logging.Simple.ConsoleOutLoggerFactoryAdapter, Common.Logging">  
  11.         <arg key="showLogName" value="true" />  
  12.         <arg key="showDataTime" value="true" />  
  13.         <arg key="level" value="DEBUG" />  
  14.         <arg key="dateTimeFormat" value="HH:mm:ss:fff" />  
  15.       </factoryAdapter>  
  16.     </logging>  
  17.   </common>  
  18.   
  19.   <quartz>  
  20.     <add key="quartz.scheduler.instanceName" value="ExampleDefaultQuartzScheduler" />  
  21.   
  22.     <add key="quartz.threadPool.type" value="Quartz.Simpl.SimpleThreadPool, Quartz" />  
  23.     <add key="quartz.threadPool.threadCount" value="10" />  
  24.     <add key="quartz.threadPool.threadPriority" value="2" />  
  25.   
  26.     <add key="quartz.jobStore.misfireThreshold" value="60000" />  
  27.     <add key="quartz.jobStore.type" value="Quartz.Simpl.RAMJobStore, Quartz" />  
  28.   </quartz>  


第三步:
在页面上新建两个按钮:

第一个按钮执行简单的计划任务
如:几秒钟执行几次

第一个按钮执行复杂的计划任务
如:每天的夜间2:00执行一次,这种复杂的任务
 

在简单按钮单击事件,代码如下:

 

[csharp] view plaincopyprint?
 
  1. ISchedulerFactory sf = new StdSchedulerFactory();  
  2.             IScheduler sched = sf.GetScheduler();  
  3.             JobDetail job = new JobDetail("job2""group2"typeof(JobExecute_2));  
  4.             SimpleTrigger trigger = new SimpleTrigger("trigger2""group2");//不同的计划任务,trigger名称不可以相同!  
  5.             trigger.StartTime = DateTime.Now.AddSeconds(5);  
  6.             trigger.RepeatInterval = 5000;  
  7.             trigger.RepeatCount = 1000;  
  8.             DateTime ft = sched.ScheduleJob(job, trigger);  
  9.             sched.Start();  

JobExecute_2这个类就是要执行的具体任务,必继继承Ijob这个接口

 

代码:

 

[csharp] view plaincopyprint?
 
  1. public class JobExecute_2:IJob  
  2.    {  
  3.        #region IJob 成员  
  4.        private static int n = 0;  
  5.        public void Execute(JobExecutionContext context)  
  6.        {  
  7.            ILog log = LogManager.GetLogger(typeof(JobExecute_2));  
  8.              
  9.            StreamWriter w = null;  
  10.            try  
  11.            {  
  12.                n++;  
  13.                w = new StreamWriter("D:\\2.txt"true, System.Text.Encoding.UTF8);  
  14.                w.WriteLine("------------------------------------");  
  15.                w.WriteLine(n+" JobExecute_1正执行:时间:" + DateTime.Now);  
  16.                w.WriteLine("------------------------------------");  
  17.                  
  18.            }  
  19.            finally  
  20.            {  
  21.                if (w != null)  
  22.                {  
  23.                    w.Close();  
  24.                    w.Dispose();  
  25.                }  
  26.            }  
  27.        }  
  28.  
  29.        #endregion  
  30.    }  


复杂任务计划如下:

 

按钮单击事件:

 

[csharp] view plaincopyprint?
 
  1. ISchedulerFactory sf = new StdSchedulerFactory();  
  2.            IScheduler sched = sf.GetScheduler();  
  3.            JobDetail job = new JobDetail("job1""group1"typeof(JobExecute_1));  
  4.            CronTrigger trigger = new CronTrigger("trigger1""group1""job1""group1");  
  5.            //二十秒执行一次  
  6.            trigger.CronExpressionString = "0/20 * * * * ?";  
  7.            sched.AddJob(job, true);  
  8.            DateTime ft = sched.ScheduleJob(trigger);  
  9.            sched.Start();  
[csharp] view plaincopyprint?
 
  1. JobExecute_1类具体代码:  
  2. <pre name="code" class="csharp"private static int i = 0;  
  3.         public void Execute(JobExecutionContext context)  
  4.         {  
  5.             StreamWriter w = null;  
  6.             try  
  7.             {  
  8.                 i++;  
  9.                 w = new StreamWriter("D:\\1.txt"true, System.Text.Encoding.UTF8);  
  10.                 w.WriteLine("------------------------------------");  
  11.                 w.WriteLine(i+" JobExecute_1正执行:时间:" + DateTime.Now);  
  12.                 w.WriteLine("------------------------------------");  
  13.                  
  14.             }  
  15.             finally  
  16.             {  
  17.                 w.Close();  
  18.                 w.Dispose();  
  19.             }  
  20.         }</pre><br>  
  21. <br>  
  22. <p></p>  
  23. <pre></pre>  
  24. <br>  
  25. 好了.到这里就大功告成了!  
  26. <p></p>  
  27. <p>可以运行一下试试啊!这样会定时在D盘根目录下1.txt和2.txt文件中写下日 志了!快快试试吧!</p>  
  28. <p><a target="_blank" href="http://download.csdn.net/detail/wanzhuan2010/3597292">源码下载</a><br>  
  29. </p>  
  30. <p>还有一些具本的使用方法及介绍可以参考:</p>  
  31. <p><a target="_blank" href="http://www.cnblogs.com/shanyou/archive/2007/09/04/881935.html">http://www.cnblogs.com/shanyou/archive/2007/09/04/881935.html<br>  
  32. </a></p>  
  33. <p><br>  
  34. </p>  
  35. <br>  
为什么方到iis上面一次都不执行呢,本地调试可以的。。
Re: wanzhuan2010 2013-03-26 12:52发表 [回复] [引用] [举报]
回复nitaiyoucala:IIS会在一段时间没有访问后清理应用程序池.此时Quartz进程也会回收.所以不会执行.建议放在Windows服务中

来源:http://blog.csdn.net/wanzhuan2010/article/details/6771498

 

知识文章分类

DoNet

阅读排行