关于Quartz.net 2.0的使用说明
Quartz.net是什么我就不详细介绍了,估计来看这篇文章的人都知道是干什么用的。
昨天部门经理在内部即时通讯上给我发了一个消息,是一个链接地址。好奇的我就打开看了看,原来是一篇关于 Quartz.net介绍的文章。刚看几行就吸引我了,这不是我在项目中经常要定时完成一些操作或者计算用到的吗?
以前在解决这类问题时,一开始想到的是在asp.net中使用Timer,应用程序启动就计算时间,然后自己执行,但是结果并不如人意,不能正常执行。
没办法,就想到用window service ,以前也做过类似的,实现起来也比较简单,但是又一个麻烦来了,用window service,部署到服务器上的时候很麻烦,经常少这少那的,配置文件还经常忘记改,为此在部署到服务器上时,心里总是不那么放心。而且,如果安装了window service,有时候还删除不了,那就有得折腾了。经理看到后也觉得麻烦,就说用控制台应用程序。
用控制台应用程序跟window service 差不多,唯一就是每次要在服务器上打开一个窗口,让程序一直运行下去。到此总还算完美,但是缺点还是每次发布新程序的时候要覆盖程序集和配置文件,还是经常会有忘记更新配置文件的事发生。
经过这一天的学习,感觉Quartz.net真的是太好了,把之前遇到的这些事情都解决掉了。以后发布新的版本后,重启应用服务器就可以了。
在这一天的学习中,发现不少问题。
网上有很多关于这个的介绍和使用,但因为我下载的是Quartz.net 2..0.1,所以在做测试程序的时候总是会有错误。后来到网上查到关于2.0的说明,才知道他与之前的版本有些不同了,很多方法和类都更改了,所以就会报很多莫名其妙的错误。
好了,现在具体来说一下怎么使用Quartz.net 2.0。
1.到网上下载Quartz.net 2.0,下载完后解压,里面有vs.net2008和vs.net2010两个版本。
2.新建一个空项目,在里面增加一个类库应用程序和web应用程序,由于我经常是应用在的asp.net web应用程序中。
3.在web应用程序中引用Quartzdll程序集(你下载的Quartz.net 2.0有)
4.在类库应用程序中新建一个测试类和一个测试方法。
5.在web应用程序默认的defalut.asp.cs文件中实现 IJob,然后实现 IJob的Execute方法,在实现方法中写上你调用的类库应用程序的测试方法。
6.在web.config文件中加入下面的代码:
[html]
<configSections>
<section name="quartz" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
<sectionGroup name="common">
<section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging"/>
</sectionGroup>
</configSections>
<common>
<logging>
<factoryAdapter type="Common.Logging.Simple.ConsoleOutLoggerFactoryAdapter, Common.Logging">
<arg key="showLogName" value="true"/>
<arg key="showDataTime" value="true"/>
<arg key="level" value="DEBUG"/>
<arg key="dateTimeFormat" value="HH:mm:ss:fff"/>
</factoryAdapter>
</logging>
</common>
<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>
7.在web应用程序中增加Global.asax文件,在Application_Start方法中加入下面的代码:
[csharp]
Quartz.ISchedulerFactory sf = new Quartz.Impl.StdSchedulerFactory();
sched = sf.GetScheduler();
sched.Start();
JobKey jobkey = new JobKey("myjob", "mygroup");
IJobDetail job = JobBuilder.Create<Test.TestExcute>().WithIdentity(jobkey).Build();
//ITrigger trigger = TriggerBuilder.Create().StartNow().Build();
//比较复杂的应用
//IOperableTrigger trigger = new CronTriggerImpl("trigName", "group1", "0/2 * * * * ?");
//简单方式
SimpleTriggerImpl trigger = new SimpleTriggerImpl("simpleTrig", "simpleGroup", 10, DateTime.Now.AddSeconds(5) - DateTime.Now);
sched.ScheduleJob(job, trigger);
8.在Application_Start方法中加入下面的代码:
[csharp]
// 在应用程序关闭时运行的代码
if (sched != null)
{
sched.Shutdown(true);
}
ok,到现在为止就可以启动你的应用程序试试了。
注意:每次调试时,要重启一下应用服务器。
关于时间设置的一些相关内容,引用自:http://www.cnblogs.com/shanyou/archive/2007/09/04/881935.html,如下:
Quartz.NET设计者做了一个设计选择来从调度分离开作业。Quartz.NET中的触发器用来告诉调度程序作业什么时候触发。框架提供了一把触发器类型,但两个最常用的是SimpleTrigger和CronTrigger。SimpleTrigger为需要简单打火调度而设计。
典型地,如果你需要在给定的时间和重复次数或者两次打火之间等待的秒数打火一个作业,那么SimpleTrigger适合你。另一方面,如果你有许多复杂的作业调度,那么或许需要CronTrigger。
CronTrigger是基于Calendar-like调度的。当你需要在除星期六和星期天外的每天上午10点半执行作业时,那么应该使用CronTrigger。正如它的名字所暗示的那样,CronTrigger是基于Unix克隆表达式的。
Cron表达式被用来配置CronTrigger实例。Cron表达式是一个由7个子表达式组成的字符串。每个子表达式都描述了一个单独的日程细节。这些子表达式用空格分隔,分别表示:
1. Seconds 秒
2. Minutes 分钟
3. Hours 小时
4. Day-of-Month 月中的天
5. Month 月
6. Day-of-Week 周中的天
7. Year (optional field) 年(可选的域)
一个cron表达式的例子字符串为"0 0 12 ? * WED",这表示“每周三的中午12:00”。
单个子表达式可以包含范围或者列表。例如:前面例子中的周中的天这个域(这里是"WED")可以被替换为"MON-FRI", "MON, WED, FRI"或者甚至"MON-WED,SAT"。
通配符('*')可以被用来表示域中“每个”可能的值。因此在"Month"域中的*表示每个月,而在Day-Of-Week域中的*则表示“周中的每一天”。
所有的域中的值都有特定的合法范围,这些值的合法范围相当明显,例如:秒和分域的合法值为0到59,小时的合法范围是0到23,Day-of-Month中值得合法凡范围是0到31,但是需要注意不同的月份中的天数不同。月份的合法值是0到11。或者用字符串JAN,FEB MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV 及DEC来表示。Days-of-Week可以用1到7来表示(1=星期日)或者用字符串SUN, MON, TUE, WED, THU, FRI 和SAT来表示.
'/'字符用来表示值的增量,例如, 如果分钟域中放入'0/15',它表示“每隔15分钟,从0开始”,如果在份中域中使用'3/20',则表示“小时中每隔20分钟,从第3分钟开始”或者另外相同的形式就是'3,23,43'。
'?'字符可以用在day-of-month及day-of-week域中,它用来表示“没有指定值”。这对于需要指定一个或者两个域的值而不需要对其他域进行设置来说相当有用。
'L'字符可以在day-of-month及day-of-week中使用,这个字符是"last"的简写,但是在两个域中的意义不同。例如,在day-of-month域中的"L"表示这个月的最后一天,即,一月的31日,非闰年的二月的28日。如果它用在day-of-week中,则表示"7"或者"SAT"。但是如果在day-of-week域中,这个字符跟在别的值后面,则表示"当月的最后的周XXX"。例如:"6L" 或者 "FRIL"都表示本月的最后一个周五。当使用'L'选项时,最重要的是不要指定列表或者值范围,否则会导致混乱。
'W' 字符用来指定距离给定日最接近的周几(在day-of-week域中指定)。例如:如果你为day-of-month域指定为"15W",则表示“距离月中15号最近的周几”。
'#'表示表示月中的第几个周几。例如:day-of-week域中的"6#3" 或者 "FRI#3"表示“月中第三个周五”。
作为一个例子,下面的Quartz.NET克隆表达式将在星期一到星期五的每天上午10点15分执行一个作业。
0 15 10 ? * MON-FRI
下面的表达式
0 15 10 ? * 6L 2007-2010
将在2007年到2010年的每个月的最后一个星期五上午10点15分执行作业。你不可能用SimpleTrigger来做这些事情。你可以用两者之中的任何一个,但哪个跟合适则取决于你的调度需要。
上一篇: *君:企业如何做好搜索引擎关键词优化