Window服务基于Quartz.Net组件实现定时任务调度(二)
前言:
在上一章中,我们通过利用控制台实现定时任务调度,已经大致了解了如何基于Quartz.Net组件实现任务,至少包括三部分:job(作业),trigger(触发器),scheduler(调度器)。其中job是需要在一个定时任务中具体执行的业务逻辑,trigger通过规定job何时并按照何种指定的规则进行执行,最后job和trigger会被注册到scheduler中,利用scheduler(调度器)来负责协调job和trigger的搭配运行。
你是否在工作中会遇到需要软件具有自动执行任务的功能,但是又不希望直接启动软件来手动执行任务?
这个时候,我们可以考虑用到window服务,基于Quartz.Net组件定时轮询数据库同步,定时邮件通知,定时处理数据等功能。
概念:
Scheduler 作业调度器
所有的scheduler都应该由SchedulerFactory来创建
//创建scheduler Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
IJob 作业接口,继承并实现Execute, 编写执行的具体作业逻辑。
通过实现IJob接口来使你的.NET组件可以很简单地被scheduler执行
public class ConsoleJob : IJob { public Task Execute(IJobExecutionContext context) { return Console.Out.WriteLineAsync($"执行作业"); } }
JobBuilder 根据设置,生成一个详细作业信息(JobDetail)。
JobBuilder是一个建造者模式,链式建造。通过静态方法构建一个JobBuilder实例,然后再调用类方法Build()创建一个IJobDetail的实现。
public static JobBuilder Create(Type jobType) { JobBuilder b = new JobBuilder(); b.OfType(jobType); return b; }
TriggerBuilder 根据规则,生产对应的Trigger,触发器可以规划执行任务
通过静态方法构建一个TriggerBuilder实例,然后再调用类方法Build()创建一个ITrigger的实现。
public static TriggerBuilder Create() { return new TriggerBuilder(); }
根据任务设置触发的开始时间和结束时间
/// <summary> /// 开始时间 /// </summary> /// <param name="startTimeUtc"></param> /// <returns></returns> public TriggerBuilder StartAt(DateTimeOffset startTimeUtc) { startTime = startTimeUtc; return this; } /// <summary> /// 结束时间 /// </summary> /// <param name="endTimeUtc"></param> /// <returns></returns> public TriggerBuilder EndAt(DateTimeOffset? endTimeUtc) { endTime = endTimeUtc; return this; }
步骤:
1、创建一个ISchedulerFactory,然后并且获取 Scheduler
2、启动 Scheduler
3、创建 job 任务
4、创建 trigger 触发器
5、使用触发器规划执行任务
开始:
首先创建一个windows服务项目
在创建好的项目中,Service1.cs文件中点击“单击此处切换到代码视图”切换到代码
这个时候我们可以注意到两个方法:OnStart (服务启动)和 OnStop(服务停止)
/// <summary> /// 服务启动 /// </summary> /// <param name="args"></param> protected override void OnStart(string[] args) { }
/// <summary> /// 服务停止 /// </summary> protected override void OnStop() { }
一、创建一个scheduler的引用:
ISchedulerFactory schedFact = new StdSchedulerFactory(); IScheduler sched = await schedFact.GetScheduler();
二、启动 scheduler:
await sched.Start();
三、实现IJob:
SyncJob.cs 实现IJob,在Execute方法里编写要处理的业务逻辑,系统就会按照Quartz的配置,定时处理
[Invoke(Name = )] public class SyncJob : IJob { public Task Execute(IJobExecutionContext context) { try { //每次执行 获取当前时间 输出当前时间 //可以在这里编写每次定时执行需要的方法 LogHelper.SaveLog()); } catch (Exception ex) { LogHelper.SaveLog(ex); } return null; } }
四、创建trigger:(建立一个某个时间点的触发器,并且每5秒执行一次)
ITrigger trigger = TriggerBuilder.Create() .WithIdentity("trigger1", "group1") //触发器 组 .WithSimpleSchedule(x => x.WithIntervalInSeconds().RepeatForever()) .Build();
五、触发器执行任务:
await sched.ScheduleJob(job, trigger);
将几个步骤整合后代码如下:
IScheduler scheduler; private async Task Run() { try { NameValueCollection props = new NameValueCollection { { "quartz.serializer.type", "binary" } }; StdSchedulerFactory factory = new StdSchedulerFactory(props); scheduler = await factory.GetScheduler(); await scheduler.Start(); Jobs.Jobs.Config(scheduler); } catch (SchedulerException ex) { LogHelper.SaveLog(ex); } }
安装
以管理员的身份打开cmd
运行:
间隔5秒执行一次后的效果:
通过日志的方式输出数据,查看效果
附加:
一、删除服务
以管理员的身份打开cmd
二、调试window服务
1)安装并运行服务
2)附加进程
3)在代码中加入断点进行调试
总结:
1.当我们在需要用到定时执行任务的时候,可以考虑使用通过window服务加上quartz组件结合的方式,实现对任务的定时执行,这也是在很多场景中可以实现的方法,比如:定时轮询数据库同步,定时邮件通知,定时处理数据等
2.通过管理工具显示当前执行的任务和执行情况,也利用调试工具调试Window服务中遇到的问题。
3.quartz还有更多的用法,可以参考资料:Quartz.Net官方文档 和 Quartz.Net开源地址
Window服务基于Quartz.Net组件实现定时任务调度(二)的更多相关文章
- 控制台基于Quartz.Net组件实现定时任务调度(一)
前言: 你曾经需要应用执行一个任务吗?比如现在有一个需求,需要每天在零点定时执行一些操作,那应该怎样操作呢? 这个时候,如果你和你的团队是用.NET编程的话,可以考虑使用Quartz.NET调度器.允 ...
- 基于Quartz实现简单的定时发送邮件
一.什么是Quartz Quartz 是一个轻量级任务调度框架,只需要做些简单的配置就可以使用:它可以支持持久化的任务存储,即使是任务中断或服务重启后,仍可以继续运行.Quartz既可以做为独立的应用 ...
- Window服务与Quartz.NET
Quartz.NET: http://quartznet.sourceforge.net/ (现为2.2版本) Sourceforge:http://sourceforge.net/projects/ ...
- MVC 使用Quartz.Net组件实现定时计划任务
最近,项目中需要执行一个计划任务,组长就让我了解一下Quartz.net 这个组件,挺简单的一个组件,实现起来特别的方便,灵活,值得推荐给大家一起学习一下这个小工具.以前我有的时候是使用定时器Time ...
- 基于Quartz.net的远程任务管理系统 二
紧接着上一篇.上一篇讲了表设计与ADO.Net基本操作.接下来,就来说说怎么动态来添加Job任务及清理过期任务吧. 首先,先理一下思路,做事情要先把思绪理清了,然后下手就快准狠了.下面是我的思路:做一 ...
- Spring与Quartz的整合实现定时任务调度 以及crontab的用法
最近在研究Spring中的定时任务功能,最好的办法当然是使用Quartz来实现.对于一个新手来说,花了我不少时间,这里我写个笔记,给大家参考. 我使用的是Maven来管理项目,需要的Jar包我给大家贴 ...
- Spring与Quartz的整合实现定时任务调度(转)
源:http://kevin19900306.iteye.com/blog/1397744 最近在研究Spring中的定时任务功能,最好的办法当然是使用Quartz来实现.对于一个新手来说,花了我不少 ...
- Spring与Quartz的整合实现定时任务调度
摘自: http://kevin19900306.iteye.com/blog/1397744 最近在研究Spring中的定时任务功能,最好的办法当然是使用Quartz来实现.对于一个新手来说,花了我 ...
- Spring与Quartz的整合实现定时任务调度(转)
最近在研究Spring中的定时任务功能,最好的办法当然是使用Quartz来实现.对于一个新手来说,花了我不少时间,这里我写个笔记,给大家参考.我使用的是Maven来管理项目,需要的Jar包我给大家贴出 ...
随机推荐
- python连接greenplum_postgresql
1. 场景描述 使用python连接greenplum或者postgresql. 2. 解决方案 2.1 真实代码 2.1.1 调用类 import dbgp as dbgp # 执行 def exe ...
- java将复数字符串虚部实部分离,并实现加减运算
java字符串构造复数 将字符串分解为复数的实部和虚部 定义一个复数类,数据成员有实部和虚部,根据传参不同构造方法重载,并定义复数的加减方法,以及toString方法.有难度的便是用字符串构造复数了, ...
- ServiceFabric极简文档-1.2 硬件环境.md
1. 一个C盘,100G,16G内存,2.5HZ2. 官网有推荐配置
- GitHub使用整理——关于上传Keil工程一些注意的点
git上传警告warning: LF will be replaced by CRLF 在上传keil工程时,会遇到warning: LF will be replaced by CRLF警告: wa ...
- 跨站脚本攻击(反射型xss)笔记(一)
环境:一个微信端(所以用浏览器演示UI有点变形) 下图是未插任何脚本时的原页面. 按惯例,上一波["><script>alert(1)</script>] 无弹 ...
- linux 安装weblogic12.1.3.0步骤
此过程为jar包安装~ 需注意:fmw_12.1.3.0.0_wls.jar 需要jdk1.7.0_15以上的版本 1.安装JDK(若已装可跳过) (1)Oracle官网下载jdk linux ...
- python 之 并发编程(守护进程、互斥锁、IPC通信机制)
9.5 守护进程 主进程创建守护进程 其一:守护进程会在主进程代码执行结束后就立即终止 其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic process ...
- Python 3.5学习笔记(第一章)
本章内容: 1.安装python 3.5 和 PyCharm 社区版 2.第一个python程序 3.变量 4.字符编码 5.用户输入 6.字符串格式化输出 7.if .else .elif 8.fo ...
- 使用nvm管理多个不同版本的nodeJS之安装成功nodeJs之后使用npm报错的问题
使用nvm安装nodeJS之后,node -v命令可以正常使用,但是npm命令一直报“npm不是内部命令”的错误,深入研究之后得到以下解决方案: 搭建步骤: (1)下载nvm https://gi ...
- 基于tcp协议的登录,文件上传和下载
[1]先登录,登录不成功循环登录,直到成功.登录成功后可以选择上传或者下载,上传有对应的文件,可选择上传哪个:下载有对应的文件,可选择下载哪个 [2]登录,上传,下载时最好设置状态码,客户端和 ...