一、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. codeforces 768 C. Jon Snow and his Favourite Number(思维+暴力)

    题目链接:http://codeforces.com/contest/768/problem/C 题意:给出n个数,k个操作,和一个x,每次操作先排序然后对奇数位数进行xor x操作,最后问k次操作后 ...

  2. NOIP 2016 组合数问题 题解

    一道sb题目,注意范围,可打表解决,打出杨辉三角,在用前缀和求解即可 代码(一维前缀和) #include<bits/stdc++.h> using namespace std; int ...

  3. 第 14 篇:交流的桥梁“评论功能”——HelloDjango 系列教程

    截止到目前为止我们的 django blog 文章展示部分,已经实现的"八九不离十"了.你以为本系列文章就要结束了吗?不能够!新的征程才刚刚开始,HelloDjango 系列文章刚 ...

  4. HDU 1015 Safecracker (DFS)

    题意:给一个数字n(n<=12000000)和一个字符串s(s<=17),字符串的全是有大写字母组成,字母的大小按照字母表的顺序,比如(A=1,B=2,......Z=26),从该字符串中 ...

  5. SQL Server2008 并发数测试

    .Net连接SQL Server2008数据库并发数,在默认情况下是100: 上面日志记录当前连接数991,说实话第一次看到还真以为能达到如此高的并发,后头仔细一看其数值都是间隔10,所以算下来是10 ...

  6. mysql 查询参数尾部有空格时被忽略

    最近再使用mysql时,无意见发现,当我查询参数尾部输入若干个空格时,依然可以查出和不加空格相同的结果,像这样 select * from wa where name='be ' 等同于 select ...

  7. Monte-Carlo Dropout

    Monte-Carlo Dropout Monte-Carlo Dropout(蒙特卡罗 dropout),简称 MC dropout. 一种从贝叶斯理论出发的 Dropout 理解方式,将 Drop ...

  8. 024 实例5-身体质量指数BMI

    目录 一."身体质量指数BMI"问题分析 1.1 身体质量指数BMI 1.2 问题需求 二."身体质量指数BMI"实例讲解 2.1 身体质量指标BMI 2.1. ...

  9. 分库分表之后,id 主键如何处理?

    其实这是分库分表之后你必然要面对的一个问题,就是 id 咋生成?因为要是分成多个表之后,每个表都是从 1 开始累加,那肯定不对啊,需要一个全局唯一的 id 来支持.所以这都是你实际生产环境中必须考虑的 ...

  10. 聊聊Spring Cloud Config

    Spring Cloud Config 转自:https://blog.csdn.net/fjnpysh/article/details/71307311 现今这个时候,微服务大行其道,互联网应用遍地 ...