Quartz.NET Windows

Quartz.NET Windows 服务示例

想必大家在项目中处理简单的后台持续任务或者定时触发任务的时候均使用 Thread 或者 Task 来完成,但是项目中的这种需求一旦多了的话就得将任务调度引入进来了,那今天就简单的介绍一下 Quartz.NET 基于 Windows 服务宿主是怎样配置使用的。

Quartz.NET 是一个优秀的任务调度框架,移植于 Java 版的 Quartz 。

官网:http://www.quartz-scheduler.net

Github:https://github.com/quartznet/quartznet

示例环境

- .Net 4.5.2

- Quartz 2.4.1

- Common.Logging 3.3.1

- log4net 2.0.5

- Common.Logging.Log4Net1213 3.3.1

源码地址:https://github.com/Wlitsoft/QuartzNETWinServiceSample

配置

1. quartz.config

这个配置文件需要放在服务运行根目录下,用于指定 quartz 的一些运行配置,比如调度名称、线程池实现组件、线程池大小、任务配置文件路径等。

 1 # You can configure your scheduler in either <quartz> configuration section
 2 # or in quartz properties file
 3 # Configuration section has precedence
 4
 5 quartz.scheduler.instanceName = QuartzNETWinServiceScheduler
 6
 7 # configure thread pool info
 8 quartz.threadPool.type = Quartz.Simpl.SimpleThreadPool, Quartz
 9 quartz.threadPool.threadCount = 10
10 quartz.threadPool.threadPriority = Normal
11
12 # job initialization plugin handles our xml reading, without it defaults are used
13 quartz.plugin.xml.type = Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin, Quartz
14 quartz.plugin.xml.fileNames = ~/Conf/jobs.config

暂时需求需要修改的只有一处,看最后一行 quartz.plugin.xml.fileNames = ~/Conf/jobs.config 指定任务的配置文件路径。

2. 任务配置文件

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!-- This file contains job definitions in schema version 2.0 format -->
 3 <job-scheduling-data xmlns="http://quartznet.sourceforge.net/JobSchedulingData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0">
 4
 5   <processing-directives>
 6     <overwrite-existing-data>true</overwrite-existing-data>
 7   </processing-directives>
 8
 9   <schedule>
10     <job>
11       <name>Job1</name>
12       <group>Jobs</group>
13       <description>任务1</description>
14       <job-type>Wlitsoft.ProjectSample.QuartzNETWinService.Job.Job1,QuartzNETWinService</job-type>
15       <durable>true</durable>
16       <recover>false</recover>
17     </job>
18     <trigger>
19       <simple>
20         <name>Job1Trigger</name>
21         <group>Jobs</group>
22         <description>每 30 秒执行一次</description>
23         <job-name>Job1</job-name>
24         <job-group>Jobs</job-group>
25         <repeat-count>-1</repeat-count>
26         <repeat-interval>30000</repeat-interval>
27       </simple>
28     </trigger>
29   </schedule>
30 </job-scheduling-data>

以下为配置文件属性:

- 任务 (job 节点)

simple 节点项说明
名称 类型 是否必填 默认值 描述
name string Y   触发器名称
group string N 默认组名 触发器名称
description string N   触发器描述
job-name string Y   要触发的任务的名称
job-group string Y   要触发的任务的组名称
durable boolean N false 任务完成后是否依然保存到数据库
recover boolean N false 应用或服务重启之后是否忽略过期任务

- 触发器 (trigger 节点)

下面说下最常用的两种触发器:

1)简单触发器(simple 节点)用于触发定时轮训执行的任务。

simple 节点项说明
名称 类型 是否必填 默认值 描述
name string Y   触发器名称
group string N 默认组名 触发器名称
description string N   触发器描述
job-name string Y   要触发的任务的名称
job-group string Y   要触发的任务的组名称
repeat-count int Y 0 重复次数(0:不执行;-1:不限次数)
repeat-interval long Y 0 间隔时间(单位:毫秒)
start-time date N 当前时间 开始时间
end-time date N   结束时间(如果不指定则一直执行直到重复次数)

2)Cron 触发器(cron 节点)根据 cron 表达式触发任务。

cron 节点项说明
名称 类型 是否必填 默认值 描述
name string Y   触发器名称
group string N 默认组名 触发器名称
description string N   触发器描述
job-name string Y   要触发的任务的名称
job-group string Y   要触发的任务的组名称
cron string Y   规则表达式
start-time date N 当前时间 开始时间
end-time date N   结束时间

注:cron 表达式在线生成:http://cron.qqe2.com

3. 日志配置文件

1) app.config

- configSctions

1 <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
2 <sectionGroup name="common">
3       <section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging" />
4 </sectionGroup>

- commong.logging 配置

1 <common>
2     <logging>
3       <factoryAdapter type="Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter, Common.Logging.Log4Net1213">
4         <arg key="configType" value="FILE-WATCH" />
5         <arg key="configFile" value="~/Conf/log4net.config" />
6         <arg key="level" value="INFO" />
7       </factoryAdapter>
8     </logging>
9 </common>

- configType : 用于指定日子配置文件类型,取值:INLINE - 在当前配置文件总;FILE-WATCH - 配置文件中。

- configFile:配置文件路径。

- level:日子输出级别。

- log4net 配置

 log4net.config

主程序代码:

 1 using System.ServiceProcess;
 2 using Common.Logging;
 3 using Quartz;
 4 using Quartz.Impl;
 5
 6 namespace Wlitsoft.ProjectSample.QuartzNETWinService
 7 {
 8     public partial class MainService : ServiceBase
 9     {
10         #region 私有属性
11
12         //日志记录这。
13         private readonly ILog _logger;
14
15         //调度器。
16         private readonly IScheduler _scheduler;
17
18         #endregion
19
20         #region 构造方法
21
22         /// <summary>
23         /// 初始化 <see cref="MainService"/> 类的新实例。
24         /// </summary>
25         public MainService()
26         {
27             InitializeComponent();
28             this._logger = LogManager.GetLogger(this.GetType());
29             StdSchedulerFactory factory = new StdSchedulerFactory();
30             this._scheduler = factory.GetScheduler();
31         }
32
33         #endregion
34
35         protected override void OnStart(string[] args)
36         {
37             this._scheduler.Start();
38             this._logger.Info("服务启动");
39         }
40
41         protected override void OnStop()
42         {
43             if (!this._scheduler.IsShutdown)
44                 this._scheduler.Shutdown();
45             this._logger.Info("服务停止");
46         }
47
48         protected override void OnPause()
49         {
50             this._scheduler.PauseAll();
51             base.OnPause();
52         }
53
54         protected override void OnContinue()
55         {
56             this._scheduler.ResumeAll();
57             base.OnContinue();
58         }
59     }
60 }

示例任务代码:

 1 using Common.Logging;
 2 using Quartz;
 3
 4 namespace Wlitsoft.ProjectSample.QuartzNETWinService.Job
 5 {
 6     public class Job1 : IJob
 7     {
 8         //日志构造者。
 9         private static readonly ILog Logger = LogManager.GetLogger("job1");
10
11         #region Implementation of IJob
12
13         /// <summary>
14         /// Called by the <see cref="T:Quartz.IScheduler" /> when a <see cref="T:Quartz.ITrigger" />
15         /// fires that is associated with the <see cref="T:Quartz.IJob" />.
16         /// </summary>
17         /// <remarks>
18         /// The implementation may wish to set a  result object on the
19         /// JobExecutionContext before this method exits.  The result itself
20         /// is meaningless to Quartz, but may be informative to
21         /// <see cref="T:Quartz.IJobListener" />s or
22         /// <see cref="T:Quartz.ITriggerListener" />s that are watching the job‘s
23         /// execution.
24         /// </remarks>
25         /// <param name="context">The execution context.</param>
26         public void Execute(IJobExecutionContext context)
27         {
28             string jobDes = context.JobDetail.Description;
29             Logger.Info($"{jobDes}运行");
30         }
31
32         #endregion
33     }
34 }

源码地址:https://github.com/Wlitsoft/QuartzNETWinServiceSample

推荐阅读:一个技术汪的开源梦

时间: 2024-08-24 21:27:13

Quartz.NET Windows的相关文章

Quartz.NET Windows 服务示例

想必大家在项目中处理简单的后台持续任务或者定时触发任务的时候均使用 Thread 或者 Task 来完成,但是项目中的这种需求一旦多了的话就得将任务调度引入进来了,那今天就简单的介绍一下 Quartz.NET 基于 Windows 服务宿主是怎样配置使用的. Quartz.NET 是一个优秀的任务调度框架,移植于 Java 版的 Quartz . 官网:http://www.quartz-scheduler.net Github:https://github.com/quartznet/quar

Python基础系列讲解-自动控制windows桌面

在使用PC时与PC交互的主要途径是看屏幕显示.听声音,点击鼠标和敲键盘等等.在自动化办公的趋势下,繁琐的工作可以让程序自动完成.比如自动化测试.自动下单交易等.很多软件除了可以GUI方式操作外还可以用CLI接口操作,不过当一些软件未提供CLI接口时,我们应该怎么办呢?我们还可以用程序控制桌面上的窗口.模拟点击鼠标或按下键盘等动作来释放自己. pywin32是一个Python库,它为Python提供访问Windows API的扩展,提供了齐全的windows常量.接口.线程以及COM机制等等,安装

Windows API参考大全新编

书名:新编Windows API参考大全 作者:本书编写组 页数:981页 开数:16开 字数:2392千字 出版日期:2000年4月第二次印刷 出版社:电子工业出版社 书号:ISBN 7-5053-5777-8 定价:98.00元 内容简介 作为Microsoft 32位平台的应用程序编程接口,Win32 API是从事Windows应用程序开发所必备的.本书首先对Win32 API函数做完整的概述:然后收录五大类函数:窗口管理.图形设备接口.系统服务.国际特性以及网络服务:在附录部分,讲解如何

从输入URL到页面加载完成的过程中都发生了什么事情?

为了便于理解,我将整个过程分为了六个问题来展开. 第一个问题:从输入 URL 到浏览器接收的过程中发生了什么事情? 从触屏到 CPU 首先是「输入 URL」,大部分人的第一反应会是键盘,不过为了与时俱进,这里将介绍触摸屏设备的交互. 触摸屏一种传感器,目前大多是基于电容(Capacitive)来实现的,以前都是直接覆盖在显示屏上的,不过最近出现了 3 种嵌入到显示屏中的技术,第一种是 iPhone 5 的 In-cell,它能减小了 0.5 毫米的厚度,第二种是三星使用的 On-cell 技术,

[转]从输入url到页面加载完成的过程中都发生了什么事情

第一个问题:从输入 URL 到浏览器接收的过程中发生了什么事情? 从触屏到 CPU 首先是「输入 URL」,大部分人的第一反应会是键盘,不过为了与时俱进,这里将介绍触摸屏设备的交互. 触摸屏一种传感器,目前大多是基于电容(Capacitive)来实现的,以前都是直接覆盖在显示屏上的,不过最近出现了 3 种嵌入到显示屏中的技术,第一种是 iPhone 5 的 In-cell,它能减小了 0.5 毫米的厚度,第二种是三星使用的 On-cell 技术,第三种是国内厂商喜欢用的 OGS 全贴合技术,具体

从输入 URL 到浏览器接收的过程中发生了什么事情

从输入 URL 到浏览器接收的过程中发生了什么事情? 原文:http://www.codeceo.com/article/url-cpu-broswer.html 从触屏到 CPU  首先是「输入 URL」,大部分人的第一反应会是键盘,不过为了与时俱进,这里将介绍触摸屏设备的交互. 触摸屏一种传感器,目前大多是基于电容(Capacitive)来实现的,以前都是直接覆盖在显示屏上的,不过最近出现了 3 种嵌入到显示屏中的技术,第一种是 iPhone 5 的 In-cell,它能减小了 0.5 毫米

采用Windows服务任务调度Quartz.NET

Windows服务使用标准的Csharp编写,任务调度框架采用开源的Quartz.NET.    首先创建Windows服务-JobService     其次创建类库项目-JobLibrary    整体解决方案架构图如下:     在JobLibary中添加Quartz.NET的Nuget包引用,添加之后,vs会自动添加一系列的依赖项,这些依赖项是必须的,别手抖删掉了.            其次再添加Common.Logging.Log4Net1211的Nuget包,他是Log4net的另

windows 服务实现定时任务调度(Quartz.Net)

我们通常在一些情况下需要软件具有一个自动执行某些任务的功能,但是又不希望直接启动软件,或者每次都要手动的来启动软件,这时我们可可以考虑到windows服务了. 首先创建一个windows服务项目(详细信息请参阅:C#创建Windows Service(Windows 服务)基础教程) 在创建好的项目中点击“单击此处切换到代码视图”切换到代码 我们主要关注一下两个方法: • OnStart – 控制服务启动 • OnStop – 控制服务停止 例: 1 public partial class S

Quartz+TopShelf实现Windows服务作业调度

Quartz:首先我贴出来了两段代码(下方),可以看出,首先根据配置文件(quartz.config),包装出一个Quartz.Core.QuartzScheduler instance,这是一个调度器,调度各个任务项(Jobs)的执行.这个调度器可以被Start.被Shutdown.被PauseAll.被ResumeAll,这对应 了windows服务的开启.停止.暂停.恢复.当启动服务,我就调用调度器的Start(),停止服务我就调用调度器的Shutdown()方法. namespace Q