前言:

上一章中,我们通过利用控制台实现定时任务调度,已经大致了解了如何基于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组件实现定时任务调度(二)的更多相关文章

  1. 控制台基于Quartz.Net组件实现定时任务调度(一)

    前言: 你曾经需要应用执行一个任务吗?比如现在有一个需求,需要每天在零点定时执行一些操作,那应该怎样操作呢? 这个时候,如果你和你的团队是用.NET编程的话,可以考虑使用Quartz.NET调度器.允 ...

  2. 基于Quartz实现简单的定时发送邮件

    一.什么是Quartz Quartz 是一个轻量级任务调度框架,只需要做些简单的配置就可以使用:它可以支持持久化的任务存储,即使是任务中断或服务重启后,仍可以继续运行.Quartz既可以做为独立的应用 ...

  3. Window服务与Quartz.NET

    Quartz.NET: http://quartznet.sourceforge.net/ (现为2.2版本) Sourceforge:http://sourceforge.net/projects/ ...

  4. MVC 使用Quartz.Net组件实现定时计划任务

    最近,项目中需要执行一个计划任务,组长就让我了解一下Quartz.net 这个组件,挺简单的一个组件,实现起来特别的方便,灵活,值得推荐给大家一起学习一下这个小工具.以前我有的时候是使用定时器Time ...

  5. 基于Quartz.net的远程任务管理系统 二

    紧接着上一篇.上一篇讲了表设计与ADO.Net基本操作.接下来,就来说说怎么动态来添加Job任务及清理过期任务吧. 首先,先理一下思路,做事情要先把思绪理清了,然后下手就快准狠了.下面是我的思路:做一 ...

  6. Spring与Quartz的整合实现定时任务调度 以及crontab的用法

    最近在研究Spring中的定时任务功能,最好的办法当然是使用Quartz来实现.对于一个新手来说,花了我不少时间,这里我写个笔记,给大家参考. 我使用的是Maven来管理项目,需要的Jar包我给大家贴 ...

  7. Spring与Quartz的整合实现定时任务调度(转)

    源:http://kevin19900306.iteye.com/blog/1397744 最近在研究Spring中的定时任务功能,最好的办法当然是使用Quartz来实现.对于一个新手来说,花了我不少 ...

  8. Spring与Quartz的整合实现定时任务调度

    摘自: http://kevin19900306.iteye.com/blog/1397744 最近在研究Spring中的定时任务功能,最好的办法当然是使用Quartz来实现.对于一个新手来说,花了我 ...

  9. Spring与Quartz的整合实现定时任务调度(转)

    最近在研究Spring中的定时任务功能,最好的办法当然是使用Quartz来实现.对于一个新手来说,花了我不少时间,这里我写个笔记,给大家参考.我使用的是Maven来管理项目,需要的Jar包我给大家贴出 ...

随机推荐

  1. python连接greenplum_postgresql

    1. 场景描述 使用python连接greenplum或者postgresql. 2. 解决方案 2.1 真实代码 2.1.1 调用类 import dbgp as dbgp # 执行 def exe ...

  2. java将复数字符串虚部实部分离,并实现加减运算

    java字符串构造复数 将字符串分解为复数的实部和虚部 定义一个复数类,数据成员有实部和虚部,根据传参不同构造方法重载,并定义复数的加减方法,以及toString方法.有难度的便是用字符串构造复数了, ...

  3. ServiceFabric极简文档-1.2 硬件环境.md

    1. 一个C盘,100G,16G内存,2.5HZ2. 官网有推荐配置

  4. GitHub使用整理——关于上传Keil工程一些注意的点

    git上传警告warning: LF will be replaced by CRLF 在上传keil工程时,会遇到warning: LF will be replaced by CRLF警告: wa ...

  5. 跨站脚本攻击(反射型xss)笔记(一)

    环境:一个微信端(所以用浏览器演示UI有点变形) 下图是未插任何脚本时的原页面. 按惯例,上一波["><script>alert(1)</script>] 无弹 ...

  6. linux 安装weblogic12.1.3.0步骤

    此过程为jar包安装~ 需注意:fmw_12.1.3.0.0_wls.jar     需要jdk1.7.0_15以上的版本 1.安装JDK(若已装可跳过) (1)Oracle官网下载jdk linux ...

  7. python 之 并发编程(守护进程、互斥锁、IPC通信机制)

    9.5 守护进程 主进程创建守护进程 其一:守护进程会在主进程代码执行结束后就立即终止 其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic process ...

  8. Python 3.5学习笔记(第一章)

    本章内容: 1.安装python 3.5 和 PyCharm 社区版 2.第一个python程序 3.变量 4.字符编码 5.用户输入 6.字符串格式化输出 7.if .else .elif 8.fo ...

  9. 使用nvm管理多个不同版本的nodeJS之安装成功nodeJs之后使用npm报错的问题

    使用nvm安装nodeJS之后,node -v命令可以正常使用,但是npm命令一直报“npm不是内部命令”的错误,深入研究之后得到以下解决方案: 搭建步骤: (1)下载nvm   https://gi ...

  10. 基于tcp协议的登录,文件上传和下载

    ​ [1]先登录,登录不成功循环登录,直到成功.登录成功后可以选择上传或者下载,上传有对应的文件,可选择上传哪个:下载有对应的文件,可选择下载哪个 ​ [2]登录,上传,下载时最好设置状态码,客户端和 ...