zoukankan      html  css  js  c++  java
  • 我心中的核心组件(可插拔的AOP)~调度组件quartz.net

    回到目录

    quartz.net是一个任务调度组件,它可以灵活的设置你的调试方式,按时间,按日期,按周期都可以很容易的实现,quartz不仅可以用在web中,而且还可以部署在winform,winservice上,下面我们就来作一个简单的调试服务,我们以WEB环境为例,WEB端采用比较流行的MVC3实现。

    首先需要引入三个组件DLL

    C5.DLL,log4net.DLL,Quartz.DLL,Common.Logging

    对于WEB项目来说,调度的注入后我们可以放在global.asax里,它可以使我们的调度任务在应用程序启动时自动启动,在应用程序结束时,自动结束,这是我们需要看到的。

    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)
            {
                //   在应用程序关闭时运行的代码
                if (sched != null)
                {
                    sched.Shutdown(true);
                }
            }

    再看我们的调度代码,即调试的回调方法,它必须要实现IJob接口,这个接口只有一个方法Execute,我们把要做的事件写在这里即可,而它有一个参数IJobExecutionContext,它所传入的是当前任务(job)的对象。

       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
        }

    下面我们再来看一下配置文件里的相关信息,它由quartz节点和log4日志配置节点组成

    <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&quot;.txt&quot;" />
          <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>

    好了,现在我们就可以运行WEB项目了,这时你的根目录的log目录下应该已经有我们的调度日志了,呵呵。

    回到目录

  • 相关阅读:
    感觉博客又要停一停了
    dockManager 添加DockPanel控件
    C# 线性渐变圆
    【Axure】母版引发事件
    【系统问题】windows10打印就蓝屏-报错误代码“win32kfull.sys”
    论扇形的绘制方式
    字符串可以使用substring等方法的原因解析
    深入理解作用域链
    实现fn(1,2)(3)(4).getSum(),使得最后输出值为实参的和即10
    函数里面for循环延迟打印引发的闭包问题
  • 原文地址:https://www.cnblogs.com/lori/p/3310919.html
Copyright © 2011-2022 走看看