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包我给大家贴出 ...
随机推荐
- 剑指offer第二版-总结:排序算法
1.排序算法比较: 2.java实现 快排: /** * 快排 * * @since 2019年2月26日 下午1:37:34 * @author xuchao */ public class Qui ...
- [USACO10FEB]给巧克力Chocolate Giving
题意简叙: FarmerFarmerFarmer JohnJohnJohn有B头奶牛(1<=B<=25000)(1<=B<=25000)(1<=B<=25000), ...
- Error:Some file crunching failed, see logs for details
Information:Gradle tasks [:myapp2:assembleDebug] Error:Some file crunching failed, see logs for deta ...
- jquery:为动态加载的元素绑定事件
最近在做项目的时候发现的一个问题,通过ajax动态加载出来的一个button值绑定不了点击事件.我使用的是datatables这款表单插件,表单内容是通过ajax动态渲染出来的. 解决方案: 通过Go ...
- Flutter初体验--环境搭建
Fluter最近火了起来,它的有点很多,今天我做一篇在Windows下安装Flutter的教程. 一.下载 无论你要安装什么软件,都要先下载下来.我用的是SourceTree,地址: https ...
- bat命令闪退问题
今天执行一个bat命令,然而会出现问题:双击执行bat命令时,命令提示符界面会闪退. 然而该bat命令在他人电脑上可正常执行,而我会遇到这种问题. 以下是我尝试的方法: 首先尝试编辑bat命令,在ba ...
- linux初学者-系统启动故障篇
linux初学者-系统启动故障篇 在系统的操作中,有时会不小心误删或者操作失误使得系统启动不起来,下文将列举几种常见的系统启动失败的情况及解决的办法. 1.删除或者覆盖mbr的446个字节 mbr的4 ...
- java练习---8
//程序员:罗元昊 2017.10.16 题目3.7 import java.util.Scanner; public class L { @SuppressWarnings("resour ...
- JQuery制作简易的考试答题管理系统
网页效果: 代码部分: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> & ...
- springBoot-mongodb
作者:纯洁的微笑出处:http://www.ityouknow.com/ 版权归作者所有,转载请注明出处 mongodb是最早热门非关系数据库的之一,使用也比较普遍,一般会用做离线数据分析来使用,放到 ...