Quartz.NET是一个开源的作业调度框架,是OpenSymphony 的 Quartz API的.NET移植,它用C#写成,可用于WinForm和ASP.NET应用中。它提供了巨大的灵活性而不牺牲简单性。你能够用它来为执行一个作业而 创建简单的或复杂的调度。它有很多特征,如:数据库支持,集群,插件,支持cron-like表达式等等。
好了,现在具体来说一下怎么使用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文件中加入下面的代码:
02 |
< section name = "quartz" type = "System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089" /> |
03 |
< sectionGroup name = "common" > |
04 |
< section name = "logging" type = "Common.Logging.ConfigurationSectionHandler, Common.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" /> |
19 |
< add key = "quartz.scheduler.instanceName" value = "ExampleDefaultQuartzScheduler" /> |
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" /> |
25 |
< add key = "quartz.jobStore.misfireThreshold" value = "60000" /> |
26 |
< add key = "quartz.jobStore.type" value = "Quartz.Simpl.RAMJobStore, Quartz" /> |
7.在web应用程序中增加Global.asax文件,在Application_Start方法中加入下面的代码:
01 |
Quartz.ISchedulerFactory sf = new Quartz.Impl.StdSchedulerFactory(); |
02 |
sched = sf.GetScheduler(); |
04 |
JobKey jobkey = new JobKey( "myjob" , "mygroup" ); |
05 |
IJobDetail job = JobBuilder.Create<Test.TestExcute>().WithIdentity(jobkey).Build(); |
10 |
SimpleTriggerImpl trigger = new SimpleTriggerImpl( "simpleTrig" , "simpleGroup" , 10, DateTime.Now.AddSeconds(5) - DateTime.Now); |
11 |
sched.ScheduleJob(job, trigger); |
8.在Application_Start方法中加入下面的代码:
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来做这些事情。你可以用两者之中的任何一个,但哪个跟合适则取决于你的调度需要。