我心中的核心組件(jian)(可(ke)插拔的AOP)~調度組件(jian)quartz.net
quartz.net是一個任務(wu)調(diao)(diao)度組件,它可以(yi)靈活的(de)(de)設置你的(de)(de)調(diao)(diao)試(shi)方式,按時間,按日(ri)期,按周期都可以(yi)很容易的(de)(de)實(shi)現,quartz不僅(jin)可以(yi)用(yong)在web中,而且還可以(yi)部署(shu)在winform,winservice上,下面我(wo)們(men)就來作一個簡單(dan)的(de)(de)調(diao)(diao)試(shi)服務(wu),我(wo)們(men)以(yi)WEB環境為例,WEB端采用(yong)比較流行的(de)(de)MVC3實(shi)現。
首先需要引入三個組件DLL
C5.DLL,log4net.DLL,Quartz.DLL,Common.Logging
對于WEB項目來說,調度的(de)(de)注入后(hou)我(wo)(wo)們可以放在global.asax里,它可以使我(wo)(wo)們的(de)(de)調度任(ren)務在應用(yong)程(cheng)序(xu)(xu)啟(qi)動時自動啟(qi)動,在應用(yong)程(cheng)序(xu)(xu)結(jie)束時,自動結(jie)束,這是我(wo)(wo)們需要(yao)看(kan)到(dao)的(de)(de)。
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) { // 在應用程(cheng)序(xu)關(guan)閉時運行的(de)代碼 if (sched != null) { sched.Shutdown(true); } }
再看我們(men)的(de)調度代碼,即調試的(de)回調方法(fa),它(ta)必須要(yao)實現IJob接口(kou),這(zhe)個(ge)接口(kou)只有一個(ge)方法(fa)Execute,我們(men)把要(yao)做的(de)事件寫在這(zhe)里即可,而它(ta)有一個(ge)參數IJobExecutionContext,它(ta)所傳入的(de)是當(dang)前任務(job)的(de)對象。
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 }
下(xia)面(mian)我們再來看一下(xia)配(pei)置(zhi)(zhi)文件里的(de)相(xiang)關信息(xi),它由quartz節點和log4日志(zhi)配(pei)置(zhi)(zhi)節點組成
<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".txt"" />
<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>
好了(le),現(xian)在我(wo)們就可以運行WEB項目(mu)(mu)了(le),這時(shi)你的(de)根目(mu)(mu)錄的(de)log目(mu)(mu)錄下應該(gai)已(yi)經有我(wo)們的(de)調度日(ri)志了(le),呵呵。