Quartz.Net实现定时任务调度的例子

Quartz一个开源的作业调度框架,OpenSymphony的开源项目。Quartz.Net 是Quartz的C#移植版本。

它一些很好的特性:

1:支持集群,作业分组,作业远程管理。

2:自定义精细的时间触发器,使用简单,作业和触发分离。

3:数据库支持,可以寄宿Windows服务,WebSite,winform等。

基础概念:

Scheduler     作业度器。

IJob             作业接口。 继承并实现Execute, 编写执行的具体作业逻辑。

JobBuilder       根据设置,生成一个详细作业信息(JobDetail)。

TriggerBuilder   根据规则,生产对应的Trigger

应用:

1创建mvc项目,并通过nuget获取Quartz的类库

2封装任务工厂

 /// <summary>
        /// 任务工厂
        /// </summary>
        /// <typeparam name="T">工作类</typeparam>
        /// <param name="DetailName">工作名称</param>
        /// <param name="TriggerName">触发器名称</param>
        /// <param name="Minute">多长时间出发一次</param>
        private static void JobsFactory<T>(string DetailName, string TriggerName, int Minute)
            where T : IJob
        {
            //工厂1
            ISchedulerFactory factory = new StdSchedulerFactory();
            //启动
            IScheduler scheduler = factory.GetScheduler();
            scheduler.Start();
            //描述工作
            IJobDetail jobDetail = new JobDetailImpl(DetailName, null, typeof(T));
            //触发器
            ISimpleTrigger trigger = new SimpleTriggerImpl(TriggerName,
                null,
                DateTime.Now,
                null,
                SimpleTriggerImpl.RepeatIndefinitely,
                TimeSpan.FromSeconds(Minute));
            //执行
            scheduler.ScheduleJob(jobDetail, trigger);
        }

3创建工作内容并实现Ijob的接口

public class CancleOrderJob : IJob
    {
        B_Order_ConfrimCancelInfoManager manager = new B_Order_ConfrimCancelInfoManager();
        public void Execute(IJobExecutionContext context)
        {
            log4net.ILog logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
            var list = manager.GetAllHandleOrder();
            if (list != null)
            {
                foreach (var item in list)
                {
                    if (item.GHandleTime < DateTime.Now)
                    {
                        try
                        {
                            manager.UpdateStatus(item.ID);
                        }
                        catch (Exception e)
                        {
                            logger.Error(e.Message);
                            throw;
                        }
                    }
                }
            }
        }
    }

在global中启动任务:

protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
            //自动取消订单
            JobsFactory<CancleOrderJob>("CancleOrderDetial", "CancleOrderTrigger", 1000);
            //自动完成订单
            JobsFactory<CompleteOrderJob>("CompleteOrderDetial", "CompleteOrderTrigger", 1000);
            //加载日志的配置文件
            log4net.Config.XmlConfigurator.Configure(new FileInfo(Server.MapPath("~/Web.config")));
        }
注意:这里用到了log4.net记录错误日志

log4.net记录错误日志的使用方法:

 

1应用log4.net的类库

 

2编写配置文件

<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="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,     log4net"/>
  </configSections>
 <log4net debug="true">
    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <param name="File" value="log//error_"/>
      <param name="AppendToFile" value="true"/>
      <param name="MaxSizeRollBackups" value="10"/>
      <param name="StaticLogFileName" value="false"/>
      <param name="DatePattern" value="yyyy-MM-dd".log""/>
      <param name="RollingStyle" value="Date"/>
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%d - %m%n"/>
      </layout>
    </appender>
    <root>
      <level value="DEBUG"/>
      <appender-ref ref="RollingLogFileAppender"/>
    </root>

3在global中读取配置文件的信息

//加载日志的配置文件
            log4net.Config.XmlConfigurator.Configure(new FileInfo(Server.MapPath("~/Web.config")));

4使用:

log4net.ILog logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
logger.Error(e.Message);

时间: 2024-09-08 05:13:09

Quartz.Net实现定时任务调度的例子的相关文章

ASP.NET使用Quartz.NET实现定时任务调度

第一步:下载Quartz.NET类库源码 下载地址:http://www.quartz-scheduler.net/ 第二步:程序集成: 1.修改网站根目录下的web.config文件,在configuration节增加:   <configSections>     <!--定时任务调度配置-->     <section name="quartz" type="System.Configuration.NameValueSectionHand

Spring整合Quartz实现定时任务调度的方法_java

最近项目中需要实现定时执行任务,比如定时计算会员的积分.调用第三方接口等,由于项目采用spring框架,所以这里结合spring框架来介绍. 编写作业类 即普通的pojo,如下: package com.pcmall.task; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class TaskA { private static Logger logger = LoggerFactory.getLogger(Ta

java sql编辑器 动态报表 数据库备份还原 quartz定时任务调度 自定义表单 java图片爬虫

获取[下载地址]   QQ: 313596790A 调用摄像头拍照,自定义裁剪编辑头像 [新录针对本系统的视频教程,手把手教开发一个模块,快速掌握本系统]B 集成代码生成器 [正反双向](单表.主表.明细表.树形表,开发利器)+快速构建表单;  技术:313596790 freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本,处理类,service等完整模块C 集成阿里巴巴数据库连接池druid;  数据库连接池  阿里巴巴的 druid.Druid在监控.可扩

企业定时任务调度器Quartz,定时查询数据库(这里还需要继续做研究)

   看到楼下各位兄弟的批评指正后,确实对我很有启发,任务如果都以配置的形式出现,在项目中是很利于维护的,所以,稍作修改,呵呵.  首先要做QuartzJob定时任务类了,这个类要实现的是Job接口,然后重写execute方法,方法中就是执行你具体要做的事情了.不过首先需要一个配置文件,里面定义了一些参数,是Quartz的一些配置.配置文件如下  Java代码   #=================================================================

Spring 3整合Quartz 2实现定时任务二:动态添加任务

前面,我们已经对Spring 3和Quartz 2用配置文件的方式进行了整合,如果需求比较简单的话应该已经可以满足了.但是很多时候,我们常常会遇到需要动态的添加或修改任务,而spring中所提供的定时任务组件却只能够通过修改xml中trigger的配置才能控制定时任务的时间以及任务的启用或停止,这在带给我们方便的同时也失去了动态配置任务的灵活性.我搜索了一些网上的解决方法,都没有很好的解决这个问题,而且大多数提到的解决方案都停留在Quartz 1.x系列版本上,所用到的代码和API已经不能适用于

Spring 3整合Quartz 2实现定时任务一:常规整合

最近工作中需要用到定时任务的功能,虽然Spring3也自带了一个轻量级的定时任务实现,但感觉不够灵活,功能也不够强大.在考虑之后,决定整合更为专业的Quartz来实现定时任务功能. 首先,当然是添加依赖的jar文件,我的项目是maven管理的,以下的我项目的依赖: <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core&l

Spring 整合Quartz 2实现定时任务五:集群、分布式架构实现探讨

到这里,功能上我们已经全实现了. 但是有时候我们的项目不是部署在一台机器上的,而是一个集群环境,往往我们的定时任务只需要一台机器执行就够了. 那么我们怎么样来实现这种集群环境下的定时任务运行呢? 前面说的支持幂等性可以在一定程序上解决这个问题,网上有版本使用数据库加锁的方式也可以,当然,还可以借助zookeeper等方式来实现更强大的分布式锁. 我在这里主要说的方式并不直接涉及到这个集群的问题,而是讨论这个定时任务运行的架构该如何来搭建,当然集群问题将自然而然得到解决. 在我的思维中,定时任务的

Spring 3整合Quartz 2实现定时任务三:动态暂停 恢复 修改和删除任务

前面我们已经完成了spring 3和quartz 2的整合以及动态添加定时任务,我们接着来完善它,使之能支持更多的操作,例如暂停.恢复.修改等. 在动态添加定时任务中其实已经涉及到了其中的一些代码,这里我们再来细化的理一理.先来看一下我们初步要实现的目标效果图,这里我们只在内存中操作,并没有把quartz的任何信息保存到数据库,即使用的是RAMJobStore,当然如果你有需要,可以实现成JDBCJobStore,那样任务信息将会更全面,貌似还有专门的监控工具,不过本人没有用过: 如上图,我们要

Spring 整合Quartz 2实现定时任务四:细化调整及一些已知的问题

之前已经把功能基本都实现了,这里我们再来优化一下代码. 我们发现,在创建.修改.和删除定时任务时,对于quartz的操作其实是可以封装成一个简单的工具辅助类的,如创建的代码可以抽取成: /** * 创建定时任务 * * @param scheduler the scheduler * @param jobName the job name * @param jobGroup the job group * @param cronExpression the cron expression * @