Quartz.NET 2.0 学习笔记(5) :实例创建Windows服务实现任务调度

Quartz.NET 项目地址 http://quartznet.sourceforge.net/

Quartz.NET 2.0 学习笔记(1) :Quartz.NET简介

Quartz.NET 2.0 学习笔记(2) :和1.0的几点不同

Quartz.NET 2.0 学习笔记(3) :通过配置文件实现任务调度

Quartz.NET 2.0 学习笔记(4) :cron表达式

Quartz.NET 2.0 学习笔记(5) :实例创建Windows服务实现任务调度

使用普通Windows服务创建Quartz.Net服务项目

  1. 首先创建Quartz.Net.2.0解决方案,添加 Windows服务 项目,添加安装程序,修改服务运行账户类型为LocalSystem(默认为User)
  2. 添加C5.dll、Common.Logging.dll、Common.Logging.Log4Net.dll、log4net.dll、Quartz.dll引用

    C5.dll 一个C#和其他CLI语言的泛型集合类。.Net2.0及以上才可以使用。简介地址:http://www.itu.dk/research/c5/
    Common.Logging.dll 通用日志接口
    Common.Logging.Log4Net.dll 提供log4net对通用日志接口(Common.Logging)的实现
    log4net.dll 小白都知道不解释

  3. 添加quartz.config文件 Quartz.Net的配置文件,并设置编译时生成到输出目录为始终复制
  4. Windows服务文件上右键查看代码,编写Quartz服务启动代码,重写OnStart、OnStop、OnPause、OnContinue方法,分别对应IScheduler的Start、Shutdown、PauseAll、ResumeAll方法,详见代码

    using System.ServiceProcess;
    using Common.Logging;
    using Quartz.Impl;namespace Quartz.Net.Service
    {public partial class QuartzService : ServiceBase{private readonly ILog logger;private IScheduler scheduler;public QuartzService(){InitializeComponent();logger = LogManager.GetLogger(GetType());ISchedulerFactory schedulerFactory = new StdSchedulerFactory();scheduler = schedulerFactory.GetScheduler();}protected override void OnStart(string[] args){scheduler.Start();logger.Info("Quartz服务成功启动");}protected override void OnStop(){scheduler.Shutdown();logger.Info("Quartz服务成功终止");}protected override void OnPause(){scheduler.PauseAll();}protected override void OnContinue(){scheduler.ResumeAll();}}
    }

至此Quarzt.Net 的Windows服务已成功创建,接下创建实现了IJob接口Quartz任务

  1. 添加Quartz.Net.Demo类库项目
  2. 添加Common.Logging.dll、log4net.dll、Quartz.dll的引用(实际项目中Common.Logging.dll和log4net.dll任意引用一个即可,此处为演示需要)
  3. 添加DemoJob1.cs,实现IJob接口,日志记录使用Common.Logging接口

    using System;namespace Quartz.Net.Demo
    {/// <summary>/// 实现IJob接口/// </summary>public class DemoJob1 : IJob{//使用Common.Logging.dll日志接口实现日志记录private static readonly Common.Logging.ILog logger = Common.Logging.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);#region IJob 成员public void Execute(IJobExecutionContext context){try{logger.Info("DemoJob1 任务开始运行");for (int i = 0; i < 10; i++){logger.InfoFormat("DemoJob1 正在运行{0}", i);}logger.Info("DemoJob1任务运行结束");}catch (Exception ex){logger.Error("DemoJob2 运行异常", ex);}}#endregion}
    }

  4. 添加DemoJob2.cs,实现IJob接口,日志记录使用log4net
    DemoJob2.cs
  5. 添加quartz_jobs.xml(配置调度任务)

    <?xml version="1.0" encoding="UTF-8"?><!-- This file contains job definitions in schema version 2.0 format --><job-scheduling-data xmlns="http://quartznet.sourceforge.net/JobSchedulingData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0"><processing-directives><overwrite-existing-data>true</overwrite-existing-data></processing-directives><schedule><!--定义示例任务1 Job--><job><name>DemoJob1</name><group>DeomJobGroup</group><description>Quartz.Net示例任务1</description><job-type>Quartz.Net.Demo.DemoJob1,Quartz.Net.Demo</job-type><durable>true</durable><recover>false</recover></job><!--定义示例任务2 Job--><job><name>DemoJob2</name><group>DeomJobGroup</group><description>Quartz.Net示例任务2</description><job-type>Quartz.Net.Demo.DemoJob2,Quartz.Net.Demo</job-type><durable>true</durable><recover>false</recover></job><!--定义示例任务1 触发器 每30秒执行一次DemoJob1任务--><trigger><cron><name>DemoJob1Trigger</name><group>DeomJobTriggerGroup</group><job-name>DemoJob1</job-name><job-group>DeomJobGroup</job-group><cron-expression>0/30 * * * * ?</cron-expression></cron></trigger><!--定义示例任务2 触发器 每分钟执行一次DemoJob2任务--><trigger><cron><name>DemoJob2Trigger1</name><group>DeomJobTriggerGroup</group><job-name>DemoJob2</job-name><job-group>DeomJobGroup</job-group><cron-expression>0 * * * * ?</cron-expression></cron></trigger><!--定义示例任务2 触发器 每天凌晨01:00执行一次DemoJob2任务--><trigger><cron><name>DemoJob2Trigger2</name><group>DeomJobTriggerGroup</group><job-name>DemoJob2</job-name><job-group>DeomJobGroup</job-group><cron-expression>0 0 1 * * ?</cron-expression></cron></trigger></schedule>
    </job-scheduling-data>

  6. 修改app.config,配置Common.logging、log4net

    <?xml version="1.0"?>
    <configuration><configSections><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"/><sectionGroup name="common"><section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging"/></sectionGroup></configSections><common><logging><factoryAdapter type="Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter, Common.Logging.Log4net"><arg key="configType" value="INLINE"/></factoryAdapter></logging></common><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><appender name="ErrorFileAppender" type="log4net.Appender.RollingFileAppender"><file value="log/error.txt" /><appendToFile value="true" /><rollingStyle value="Size" /><maxSizeRollBackups value="100" /><maximumFileSize value="10240KB" /><staticLogFileName value="true" /><Encoding value="UTF-8" /><filter type="log4net.Filter.LevelRangeFilter"><param name="LevelMin" value="WARN" /><param name="LevelMax" value="FATAL" /></filter><layout type="log4net.Layout.PatternLayout"><conversionPattern value="%date %-5level %logger - %message%newline" /></layout></appender><root><level value="INFO" /><appender-ref ref="InfoFileAppender" /><appender-ref ref="ErrorFileAppender" /></root></log4net><!-- We use quartz.config for this server, you can always use configuration section if you want to.Configuration section has precedence here.  --><!--<quartz ></quartz>--><startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup>
    </configuration>

Quartz.Net.Service和Quartz.Net.Demo均创建完毕后,进行编译然后把我们创建的Quartz服务添加到系统的服务中去

  1. 把编译好的如下文件拷贝到D:\QuartzService\
  2. 控制台下执行如下命令:sc create QuartzService binpath= D:\QuartzService\Quartz.Net.Service.exe 完成服务创建
  3. 启动QuartzService服务可以看到D:\QuartzService\的日志文件有如下输出
    View Code

日志记录时可以根据需要使用Common.logging或者log4net,因为Quartz.Net使用的Common.logging的log4net实现,所以必须同时引用这两个dll,具体项目中引用这两个任意一个效果都是一样的(在使用log4net的前提下)

源文件下载:Quartz-2.0Demo.rar

PS:

有很多人问Quartz启动后,关闭服务时无法及时关闭,必须杀进程才可以,解决方法时在调用Shutdown方法时传入参数false,即不等待任务运行结束立即关闭

scheduler.Shutdown(false);

Quartz.NET 2.0 学习笔记(5) :实例创建Windows服务实现任务调度 Quartz.NET 项目地址 http://quartznet.sourceforge.net/ Quar相关推荐

  1. expect学习笔记及实例详解【转】

    1. expect是基于tcl演变而来的,所以很多语法和tcl类似,基本的语法如下所示: 1.1 首行加上/usr/bin/expect 1.2 spawn: 后面加上需要执行的shell命令,比如说 ...

  2. Zabbx6.0(学习笔记)

    Zabbx6.0(学习笔记) 目录导航 Zabbx6.0(学习笔记) 一.为什么 需要监控系统 二.如何选择监控 三.Zabbix概述 四.Zabbix安装哪个版本? Zabbix安装要求 1.硬件 ...

  3. ZYNQ学习笔记_GPIO实例:通过EMIO实现按键控制LED

    ZYNQ学习笔记_GPIO实例:通过EMIO实现按键控制LED 总体思路 Block Design界面配置IP核并导出硬件配置 在SDK中编写C代码 下载PS和PL的联合工程到开发板 总体思路 首先需 ...

  4. flink1.12.0学习笔记第2篇-流批一体API

    flink1.12.0学习笔记第 2 篇-流批一体API flink1.12.0学习笔记第1篇-部署与入门 flink1.12.0学习笔记第2篇-流批一体API flink1.12.0学习笔记第3篇- ...

  5. TensorFlow2.0 学习笔记(三):卷积神经网络(CNN)

    欢迎关注WX公众号:[程序员管小亮] 专栏--TensorFlow学习笔记 文章目录 欢迎关注WX公众号:[程序员管小亮] 专栏--TensorFlow学习笔记 一.神经网络的基本单位:神经元 二.卷 ...

  6. CCC3.0学习笔记_数字密钥数据结构

    CCC3.0学习笔记_数字密钥数据结构 系列文章目录 文章目录 系列文章目录 前言 4.1 Applet Instance Layout 4.2 Digital Key Structure 4.2.1 ...

  7. CCC3.0学习笔记_证书数据

    CCC3.0学习笔记_证书数据 系列文章目录 文章目录 系列文章目录 前言 1. [A] - SE Root CA Certificate 2. [B] - SE Root Certificate 3 ...

  8. 【面向对象】 JML(Level 0) 学习笔记

    JML Level 0 学习笔记 注释结构 JML表达式 原子表达式 量化表达式 集合表达式 操作符 方法规格 类型规格 约束限制 方法与类型规格的关系 一个完整例子   JML是用于对Java程 在 ...

  9. flink1.12.0学习笔记第1篇-部署与入门

    flink1.12.0学习笔记第 1 篇-部署与入门 flink1.12.0学习笔记第1篇-部署与入门 flink1.12.0学习笔记第2篇-流批一体API flink1.12.0学习笔记第3篇-高级 ...

最新文章

  1. Python两个字典键同值相加的几种方法
  2. CUDA 并行计算优化策略总结
  3. 概率论 - BZOJ - 4001 TJOI2015
  4. py文件 添加模块映射_Python模块的定义,模块的导入,__name__用法实例分析
  5. matlab greythresh,Matlab-图形算法和图像处理指南
  6. MapReduce的编程规范
  7. Mybatis入门 使用注解
  8. Django框架-Form组件
  9. jquery ajax 异步分页,jquery 分页 Ajax异步
  10. endnote修改正文中参考文献标注_如何用Endnote在论文中插入参考文献
  11. Keras-4 mnist With CNN
  12. Fiddler抓包工具入门:软件测试员必知的抓取https协议的方法
  13. 遗传算法matlab_遗传算法 (GA) 进行多参数拟合 【MATLAB】
  14. Beetl的基本用法
  15. 学习型红外遥控器的FPGA设计与实现
  16. HEU The message
  17. xp计算机用户名和密码忘记了怎么办,电脑的XP系统密码被不小心忘记了怎么办?...
  18. 让理科生沉默,让文科生落泪的题
  19. stm32 boot 模式
  20. 垃圾污渍纹理PS笔刷

热门文章

  1. 基于Kotlin(可转Java)开发的网易云音乐爬虫项目
  2. 使用git tag进行版本管理,如何进行历史版本bug 修复
  3. 【pandas】testdata数据集分析
  4. arcsde for oracle11g,arcsde10.0 for oracle11g 分布式安装教程
  5. 你不是脾气太坏,而是格局太小
  6. UEFI+GPT、Legacy+MBR引导模式介绍 引导修复
  7. 数据分析师1.1量化交易系统介绍
  8. 阿里云基础--ECS和RDS
  9. 20k~65k, 2018年最后一波热门技术岗位, 立刻投简历, 跳槽才是加薪的捷径
  10. 《云计算等保通用解决方案》