一、Quartz.NET介绍

Quartz.NET是一个强大、开源、轻量的作业调度框架,是 OpenSymphony 的 Quartz API 的.NET移植,用C#改写,可用于winform和asp.net mvc、.Net Core应用中。它灵活而不复杂。你能够用它来为执行一个作业而创建简单的或复杂的作业调度。它有很多特征,如:数据库支持,集群,插件,支持cron-like表达式等等。

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

源码:https://github.com/quartznet/quartznet

二、Quartz.NET用途

一,可以定时发邮件通知。

二 , 电商网站的定时打折活动。(比如规定11月11日 淘宝购买女朋友打八折)

三, 定时对数据更新 或者添加。

四,自己朋友生日。 可以定时发生日祝福。 等等 (我也不一一举例了)

三、Quartz.NET安装

我使用的VS版本是2017的  选择工具  - NuGet包管理 - 管理解决方案的NuGet包   输入 Quartz.NET 安装

还可以通过NuGet控制台 通过安装命令

Install-Package Quartz

四、Quartz.NET实现思路

一:继承并实现IJob接口,在Execute 方法中写你要定时执行的事情(切记 )

二:使用Quartz创建任务调度核心代码步骤

  1、配置Quartz,创建工厂,开启调度。

  2、创建工作任务

  3、创建触发器

  4、将任务加入到任务池

三:添加任务,使用Topshelf部署Windows服务,定时执行

五、代码步骤讲解

一:继承并实现IJob接口,在Execute 方法中写你要做的事情(切记 )

   

 using Quartz.Utility;
using System;
using System.IO;
using System.Threading.Tasks; namespace Quartz.JobWork
{
public class MyJob : IJob
{
public Task Execute(IJobExecutionContext context)
{
Task task = null;
try
{
string fileName = "printlog.txt";
StreamWriter writer = new StreamWriter(fileName, true);
task = writer.WriteLineAsync(string.Format("{0},测试", DateTime.Now.ToLongTimeString()));
writer.Close();
writer.Dispose();
}
catch (Exception ex)
{
LogHelper.WriteLog(ex.Message.ToString(), ex);
}
return task;
}
}
}

二:使用Quartz创建任务调度核心代码步骤

注:这里提供一个QuartzHelper帮助类,直接把以下代码copy过去即可用,只需要重写Execute方法即可。Quartz3.0及以上的版本是采用的异步,3.0以下的版本没有采用异步,使用方法是一样的

 using Quartz.Impl;
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks; namespace Quartz.Utility
{
public class QuartzHelper
{
static readonly IScheduler _scheduler;
static QuartzHelper()
{
var properties = new NameValueCollection();
// 设置线程池
properties["quartz.threadPool.type"] = "Quartz.Simpl.SimpleThreadPool, Quartz";
//设置线程池的最大线程数量
properties["quartz.threadPool.threadCount"] = "";
//设置作业中每个线程的优先级
properties["quartz.threadPool.threadPriority"] = ThreadPriority.Normal.ToString(); // 远程输出配置
properties["quartz.scheduler.exporter.type"] = "Quartz.Simpl.RemotingSchedulerExporter, Quartz";
properties["quartz.scheduler.exporter.port"] = ""; //配置端口号
properties["quartz.scheduler.exporter.bindName"] = "QuartzScheduler";
properties["quartz.scheduler.exporter.channelType"] = "tcp"; //协议类型 //创建一个工厂
var schedulerFactory = new StdSchedulerFactory(properties);
//启动
_scheduler = schedulerFactory.GetScheduler().Result;
//1、开启调度
_scheduler.Start();
}
/// <summary>
/// 时间间隔执行任务
/// </summary>
/// <typeparam name="T">任务类,必须实现IJob接口</typeparam>
/// <param name="seconds">时间间隔(单位:秒)</param>
public static async Task<bool> ExecuteInterval<T>(int seconds) where T : IJob
{
//2、创建工作任务
IJobDetail job = JobBuilder.Create<T>().Build();
// 3、创建触发器
ITrigger trigger = TriggerBuilder.Create()
.StartNow()
.WithSimpleSchedule(
x =>x.WithIntervalInSeconds(seconds)
//x.WithIntervalInMinutes(1)
.RepeatForever())
.Build();
//4、将任务加入到任务池
await _scheduler.ScheduleJob(job, trigger);
return true;
} /// <summary>
/// 指定时间执行任务
/// </summary>
/// <typeparam name="T">任务类,必须实现IJob接口</typeparam>
/// <param name="cronExpression">cron表达式,即指定时间点的表达式</param>
public static async Task<bool> ExecuteByCron<T>(string cronExpression) where T : IJob
{
//2、创建工作任务
IJobDetail job = JobBuilder.Create<T>().Build();
//3、创建触发器
ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create()
.StartNow()
.WithCronSchedule(cronExpression)
.Build();
//4、将任务加入到任务池
await _scheduler.ScheduleJob(job, trigger);
return true;
}
}
}

三:添加任务,Topshelf部署Windows服务,定时执行

    

 namespace Quartz
{
public class Program
{
static void Main(string[] args)
{
string cronExpression = "0 0 8,23 * * ? "; //=>这是指每天的9点和16点执行任务
cronExpression = "30 0/1 * * * ?";
//QuartzHelper.ExecuteByCron<MyJob>(cronExpression).Wait();  //=>这是调用Cron计划方法
QuartzHelper.ExecuteInterval<MyJob>().Wait();
/*
简单说一下Cron表达式吧, 由7段构成:秒 分 时 日 月 星期 年(可选) "-" :表示范围 MON-WED表示星期一到星期三
"," :表示列举 MON,WEB表示星期一和星期三
"*" :表是“每”,每月,每天,每周,每年等
"/" :表示增量:0/15(处于分钟段里面) 每15分钟,在0分以后开始,3/20 每20分钟,从3分钟以后开始
"?" :只能出现在日,星期段里面,表示不指定具体的值
"L" :只能出现在日,星期段里面,是Last的缩写,一个月的最后一天,一个星期的最后一天(星期六)
"W" :表示工作日,距离给定值最近的工作日
"#" :表示一个月的第几个星期几,例如:"6#3"表示每个月的第三个星期五(1=SUN...6=FRI,7=SAT) 如果Minutes的数值是 '0/15' ,表示从0开始每15分钟执行 如果Minutes的数值是 '3/20' ,表示从3开始每20分钟执行,也就是‘3/23/43’
*/
HostFactory.Run(x =>
{
x.UseLog4Net();
x.Service<TownCrier>(s =>
{
s.ConstructUsing(name => new TownCrier());
s.WhenStarted(tc => tc.Start());
s.WhenStopped(tc => tc.Stop());
});
x.RunAsLocalSystem();
x.SetDescription("QuartzJob任务定时发送");
x.SetDisplayName("QuartzJob");
x.SetServiceName("QuartzJob"); x.EnablePauseAndContinue();
});
}
}
}

  TownCrier服务实现类

 public class TownCrier
{
readonly Timer _timer;
public TownCrier()
{
_timer = new Timer() { AutoReset = true };
_timer.Elapsed += (sender, eventArgs) => Console.WriteLine("---------------------DateTime: {0} ------------------- ", DateTime.Now);
}
public void Start() { _timer.Start(); }
public void Stop() { _timer.Stop(); }
}

  最后就可以做自己想要做的事情了!

   下期讲解使用Topshelf部署Windows服务!

C#基于Quartz.NET实现任务调度并部署Windows服务的更多相关文章

  1. netcore项目在Windows部署:使用NSSM部署Windows服务

    NSSM部署Windows服务 1 准备工作 在Windows平台部署Asp.net core应用程序一般采用IIS,但是如果我们的net core应用执行的是定时任务,需要开机自启,稳定运行的话,使 ...

  2. 【JavaService】使用Java编写部署windows服务

    如果你玩windows系统,你对服务这个东西并不会陌生,服务可以帮我们做很多事情,在不影响用户正常工作的情况下,可以完成很多我们需要的需求. 众所周知,微软的visio studio内置的Servic ...

  3. .NET Core部署Windows服务

    创建 首先你要确保你已经安装了.NET Core 3.0或以上版本. 老版本的Windows服务请看 这篇文章 使用命令行创建:  dotnet new worker 使用Visual Studio创 ...

  4. RDIFramework.NET框架基于Quartz.Net实现任务调度详解及效果展示

    在上一篇Quartz.Net实现作业定时调度详解,我们通过实例代码详细讲解与演示了基于Quartz.NET开发的详细方法.本篇我们主要讲述基于RDIFramework.NET框架整合Quartz.NE ...

  5. 基于.NetCore和ABP框架如何让Windows服务执行Quartz定时作业

    demo地址:ABP.WindowsService 该系列文章启发自 How to: Create a Windows Service that schedules jobs, logs and is ...

  6. ASP.NET Core使用TopShelf部署Windows服务

    asp.net core很大的方便了跨平台的开发者,linux的开发者可以使用apache和nginx来做反向代理,windows上可以用IIS进行反向代理. 反向代理可以提供很多特性,固然很好.但是 ...

  7. 使用nssm部署windows服务启动应用

    swoole和workerman他们都可以实现即时通信的功能,这里我简单的就workman作为windows服务器启动为例说哈吧.直接进入正题: 下载这个聊天室项目 workerman聊天室 http ...

  8. 使用Topshelf部署Windows服务

    新建一个控制台应用程序,使用Nuget安装TopShelf: nuget Install-Package Topshelf 测试代码: 在Main中输入: //FileInfo fi = new Fi ...

  9. 基于 Quartz 开发企业级任务调度应用

    原文地址:http://www.ibm.com/developerworks/cn/opensource/os-cn-quartz/index.html Quartz 基本概念及原理 Quartz S ...

随机推荐

  1. 【github】论怎么去写一个高大上的ReadMe

    前言 以前我时常觉得,自己写的ReadMe很单调乏味,但后来仔细研究一下后,发现有很多方式可以让ReadMe在简洁的基础上变得好看些,所以在这里和大家分享,如果大家有更好的想法,也非常欢迎在评论区留言 ...

  2. javascript 多个异步处理解决方法

    JS异步处理真是一个让人头疼的东西,尤其是AJAX这个玩意.刚开始为了方便我会将jquery ajax 这个属性这样设置 async: false但是这样做问题很多,会让浏览器假死,好在ajax提供了 ...

  3. Linux入门基础之 中

    五.Linux 下获取帮助 没必要记住所有东西 Linux 提供了极为详细的帮助工具及文档,一定要养成查帮助文档的习惯,可以大大减少需要记忆的东西并且提高效率 5.1.HELP 几乎所有命令都可以使用 ...

  4. 关于jpa的Specification自定义函数,实现oracle的decode;以及如何在静态方法中调用注入的service

    如何在静态方法中调用注入的service Public class ClassA{ public static ClassA classA; @Resource private Service ser ...

  5. Go语言基础之基本数据类型

    Go语言中有丰富的数据类型,除了基本的整型.浮点型.布尔型.字符串外,还有数组.切片.结构体.函数.map.通道(channel)等.Go 语言的基本类型和其他语言大同小异. 基本数据类型 整型 整型 ...

  6. 新书推荐《再也不踩坑的Kubernetes实战指南》

      <再也不踩坑的Kubernetes实战指南>终于出版啦.目前可以在京东.天猫购买,京东自营和当当网预计一个星期左右上架. 本书贴合生产环境经验,解决在初次使用或者是构建集群中的痛点,帮 ...

  7. 【第二十二篇】从客户端中检测到有潜在危险的 Request.Form 值

    提交数据的时候  用js的方法   escape(富文本框的值)    例:escape(UM.getEditor('Content').getContent()); 取值的时候   unescape ...

  8. Spring Boot2 系列教程(六)自定义 Spring Boot 中的 starter

    我们使用 Spring Boot,基本上都是沉醉在它 Stater 的方便之中.Starter 为我们带来了众多的自动化配置,有了这些自动化配置,我们可以不费吹灰之力就能搭建一个生产级开发环境,有的小 ...

  9. Stanford公开课《编译原理》学习笔记(1~4课)

    目录 一. 编译的基本流程 二. Lexical Analysis(词法分析阶段) 2.1 Lexical Specification(分词原则) 2.2 Finite Automata (典型分词算 ...

  10. Day 21 进程管理

    1.什么是进程 比如: 开发写的代码我们称为程序,那么将开发的代码运行起来.我们称为进程. 总结一句话就是: 当我们运行一个程序,那么我们将运行的程序叫进程. PS1: 当程序运行为进程后,系统会为该 ...