Quartz.NET 2.0 学习笔记(5) :实例创建Windows服务实现任务调度 Quartz.NET 项目地址 http://quartznet.sourceforge.net/ Quar
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服务项目
- 首先创建Quartz.Net.2.0解决方案,添加 Windows服务 项目,添加安装程序,修改服务运行账户类型为LocalSystem(默认为User)
- 添加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 小白都知道不解释 - 添加quartz.config文件 Quartz.Net的配置文件,并设置编译时生成到输出目录为始终复制
- 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任务
- 添加Quartz.Net.Demo类库项目
- 添加Common.Logging.dll、log4net.dll、Quartz.dll的引用(实际项目中Common.Logging.dll和log4net.dll任意引用一个即可,此处为演示需要)
- 添加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} }
- 添加DemoJob2.cs,实现IJob接口,日志记录使用log4net
DemoJob2.cs
- 添加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>
- 修改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".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><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服务添加到系统的服务中去
- 把编译好的如下文件拷贝到D:\QuartzService\
- 控制台下执行如下命令:sc create QuartzService binpath= D:\QuartzService\Quartz.Net.Service.exe 完成服务创建
- 启动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相关推荐
- expect学习笔记及实例详解【转】
1. expect是基于tcl演变而来的,所以很多语法和tcl类似,基本的语法如下所示: 1.1 首行加上/usr/bin/expect 1.2 spawn: 后面加上需要执行的shell命令,比如说 ...
- Zabbx6.0(学习笔记)
Zabbx6.0(学习笔记) 目录导航 Zabbx6.0(学习笔记) 一.为什么 需要监控系统 二.如何选择监控 三.Zabbix概述 四.Zabbix安装哪个版本? Zabbix安装要求 1.硬件 ...
- ZYNQ学习笔记_GPIO实例:通过EMIO实现按键控制LED
ZYNQ学习笔记_GPIO实例:通过EMIO实现按键控制LED 总体思路 Block Design界面配置IP核并导出硬件配置 在SDK中编写C代码 下载PS和PL的联合工程到开发板 总体思路 首先需 ...
- flink1.12.0学习笔记第2篇-流批一体API
flink1.12.0学习笔记第 2 篇-流批一体API flink1.12.0学习笔记第1篇-部署与入门 flink1.12.0学习笔记第2篇-流批一体API flink1.12.0学习笔记第3篇- ...
- TensorFlow2.0 学习笔记(三):卷积神经网络(CNN)
欢迎关注WX公众号:[程序员管小亮] 专栏--TensorFlow学习笔记 文章目录 欢迎关注WX公众号:[程序员管小亮] 专栏--TensorFlow学习笔记 一.神经网络的基本单位:神经元 二.卷 ...
- CCC3.0学习笔记_数字密钥数据结构
CCC3.0学习笔记_数字密钥数据结构 系列文章目录 文章目录 系列文章目录 前言 4.1 Applet Instance Layout 4.2 Digital Key Structure 4.2.1 ...
- CCC3.0学习笔记_证书数据
CCC3.0学习笔记_证书数据 系列文章目录 文章目录 系列文章目录 前言 1. [A] - SE Root CA Certificate 2. [B] - SE Root Certificate 3 ...
- 【面向对象】 JML(Level 0) 学习笔记
JML Level 0 学习笔记 注释结构 JML表达式 原子表达式 量化表达式 集合表达式 操作符 方法规格 类型规格 约束限制 方法与类型规格的关系 一个完整例子 JML是用于对Java程 在 ...
- flink1.12.0学习笔记第1篇-部署与入门
flink1.12.0学习笔记第 1 篇-部署与入门 flink1.12.0学习笔记第1篇-部署与入门 flink1.12.0学习笔记第2篇-流批一体API flink1.12.0学习笔记第3篇-高级 ...
最新文章
- Python两个字典键同值相加的几种方法
- CUDA 并行计算优化策略总结
- 概率论 - BZOJ - 4001 TJOI2015
- py文件 添加模块映射_Python模块的定义,模块的导入,__name__用法实例分析
- matlab greythresh,Matlab-图形算法和图像处理指南
- MapReduce的编程规范
- Mybatis入门 使用注解
- Django框架-Form组件
- jquery ajax 异步分页,jquery 分页 Ajax异步
- endnote修改正文中参考文献标注_如何用Endnote在论文中插入参考文献
- Keras-4 mnist With CNN
- Fiddler抓包工具入门:软件测试员必知的抓取https协议的方法
- 遗传算法matlab_遗传算法 (GA) 进行多参数拟合 【MATLAB】
- Beetl的基本用法
- 学习型红外遥控器的FPGA设计与实现
- HEU The message
- xp计算机用户名和密码忘记了怎么办,电脑的XP系统密码被不小心忘记了怎么办?...
- 让理科生沉默,让文科生落泪的题
- stm32 boot 模式
- 垃圾污渍纹理PS笔刷
热门文章
- 基于Kotlin(可转Java)开发的网易云音乐爬虫项目
- 使用git tag进行版本管理,如何进行历史版本bug 修复
- 【pandas】testdata数据集分析
- arcsde for oracle11g,arcsde10.0 for oracle11g 分布式安装教程
- 你不是脾气太坏,而是格局太小
- UEFI+GPT、Legacy+MBR引导模式介绍 引导修复
- 数据分析师1.1量化交易系统介绍
- 阿里云基础--ECS和RDS
- 20k~65k, 2018年最后一波热门技术岗位, 立刻投简历, 跳槽才是加薪的捷径
- 《云计算等保通用解决方案》