Cron任务调度CronNET
Cron任务调度CronNET
如果用知乎,可以关注专栏:.NET开源项目和PowerBI社区
Quartznet大名鼎鼎应该很少有人不知道,相关的开源项目很多,不过那东东对新手来说,有点晦涩,加上哪个Cron表达式,可能一进去云里雾里的。今天给大家介绍一个简单的在.NET平台上运行Cron计划任务的组件CronNET。同时也给大家推介几个Cron表达式的工具。
本文原文地址:.NET平台开源项目速览(21)Cron任务调度CronNET
1.Cron介绍和工具
cron是一个linux下的定时执行工具,可以在无需人工干预的情况下运行作业。cron服务器可以根据配置文件约定的时间来执行特定的作务。所以其他组件和平台根据其语法做了支持,就有了各种各样的语言版本。Cron的语法表达式非常灵活,也非常复杂,不过不建议大家一次性撸进去出不来,需要用到的时候用下面几个工具查一下,生成就好。慢慢就理解了,当然简单主要的语法看得懂就行,抄来抄去就会了。
如果要了解Cron语法,可以看下面这篇文章,非常简洁和全面:Cron表达式。
下面给大家介绍2个好用的Cron工具:
1.在线Cron表达式生成器:http://cron.qqe2.com/。配置相当全面,可以把你想要执行的任务直接图形化界面配置出来,得到Cron表达式。也可以反解析到UI,如下图:

2.Cron表达式解析组件:https://github.com/bradymholt/cron-expression-descriptor,可以将Cron表达的转换为自然语言,支持很多语言,包括中文。重点包括了中文
看看第3部分我们的演示。
2.CronNET介绍和使用
CronNET是一个简单的C#类库,用来执行Cron表达式定义的计划任务。它支持绝大部分Cron表达式,看测试下面的代码,非常全面了。而且整个下面短小精悍,总过不过110行代码。所以集成到自己的项目中去也非常容易。
Github地址:https://github.com/kevincolyar/CronNET
下面我们通过一段简单的代码来看看效果和使用。自己下面源代码编译dll,引用命名空间 using CronNET
2.1 基本使用
定义一个全局的CronDaemon对象,用来存储Job,在main函数中添加cron任务,我添加了一个每分钟执行的任务,任务的内容就是打印个日志。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
private static CronDaemon cron_daemon = new CronDaemon();static void Main(string[] args){ cron_daemon.AddJob("* * * * *", MiniteTask); Console.WriteLine("任务开始时间:{0}", DateTime.Now.ToLongTimeString()); cron_daemon.Start(); while (true) Thread.Sleep(6000);}static void MiniteTask(){ Console.WriteLine("{0}:定时任务执行",DateTime.Now.ToLongTimeString());} |
看看执行结果,每分钟都执行了一次:

2.2 Windows服务
下面我们看看在windows服务中怎么使用,起始原理差不多,Github里面有一个windows服务的例子,不过我一般比较喜欢用XAgent来完成。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
class MyService : AgentServiceBase<MyService>{ //Job private static CronDaemon cron_daemon = new CronDaemon(); internal static void MiniteTask() { XTrace.WriteLine("{0}:定时任务执行", DateTime.Now.ToLongTimeString()); } public MyService() { //设置服务名称和描述,以及线程数 DisplayName = "CronTestService"; Description = "CronTestService"; ThreadCount = 0; cron_daemon.AddJob("* * * * *", MiniteTask);//添加job } /// <summary>服务启动</summary> /// </remarks> protected override void StartWork(String reason) { XTrace.WriteLine("任务开始时间:{0}", DateTime.Now.ToLongTimeString()); cron_daemon.Start();//启动 base.StartWork(reason); } /// <summary>服务停止</summary> protected override void StopWork(String reason) { base.StopWork(reason); }} |
XAgent是一个快速,图形化界面的Windows服务工具,集成在Newlife组件中。使用可以参考我的这篇博客:探索Newlife组件:服务代理利器XAgent的前世今生。
下面是运行效果,结果,结果在右边日志文件中。

3.cron-expression-descriptor使用
cron-expression-descriptor是一个C#开发的开源Cron表达式解析器,可以将Cron表达式转换为自然语言,支持英语/西班牙语/俄语/法语/简体中文等语言。支持的平台有.NET Core1.0,.NET Framework 4.5和Mono 4.5。
Github地址:https://github.com/bradymholt/cron-expression-descriptor
比如我们来看几个例子,直接在VS中使用Nuget,搜索CronExpressionDescriptor安装即可:
|
1
2
3
4
5
6
7
8
9
10
11
|
static void Main(string[] args){ XTrace.UseConsole(); XTrace.WriteLine(ExpressionDescriptor.GetDescription("*/6 * 1 * *", new Options() { Locale= "zh-CN" })); XTrace.WriteLine(ExpressionDescriptor.GetDescription("* * * 2,6 *", new Options() { Locale = "zh-CN" })); XTrace.WriteLine(ExpressionDescriptor.GetDescription("*/3 12 * 1 MON-FRI", new Options() { Locale = "zh-CN" })); Console.ReadKey();} |
解析的内容如下,我们在选项中配置了Local="zh-CN":

注意安装后,支持的语言资源文件都在bin目录下,如下面就是支持的语言:

所以有了这东西,做一个在线版的Cron解析器也很easy了。。。好了,剩下的该你在业务中表演了。
4.资源
本文演示代码下载:CronNET.rar
Cron表达式语法参考:Cron表达式
CronNET Github地址:https://github.com/kevincolyar/CronNET
Cron解析器Github地址:https://github.com/bradymholt/cron-expression-descriptor
Cron任务调度CronNET的更多相关文章
- .NET平台开源项目速览(21)Cron任务调度CronNET
如果用知乎,可以关注专栏:.NET开源项目和PowerBI社区 Quartznet大名鼎鼎应该很少有人不知道,相关的开源项目很多,不过那东东对新手来说,有点晦涩,加上哪个Cron表达式,可能一进去云里 ...
- ubuntu入门
Ubuntu的发音 Ubuntu,源于非洲祖鲁人和科萨人的语言,发作 oo-boon-too 的音.了解发音是有意义的,您不是第一个为此困惑的人,当然,也不会是最后一个:) 大多数的美国人读 ubun ...
- Mistral 工作流组件之一 概述
Mistral的前世今生: Mistral是Mirantis公司为Openstack开发的工作流组件,提供Workflow As a Service.典型的应用场景包括任务计划服务Cloud Cro ...
- Laravel 5.1使用命令行模式(artisan)运行php脚本
Laravel有内置命令调度器,可以方便的实现Cron. 任务调度定义在app/Console/Kernel.php文件的schedule方法中,该方法已经包含了一个示例.Laravel里有两种方法执 ...
- 有关linux日志分析的详细介绍
linux的日志文件可以帮助我们了解系统所处的状态,比如查出哪些用户有登入,及其它安全相关的一些问题. linux下的日志分析. 以下内容,部分参考了:探讨 linux 日志分析 这篇文章. 1.了解 ...
- Ubuntu完全教程,让你成为Ubuntu高手!
Ubuntu的发音 Ubuntu,源于非洲祖鲁人和科萨人的语言,发作 oo-boon-too 的音.了解发音是有意义的,您不是第一个为此困惑的人,当然,也不会是最后一个:) 大多数的美国人读 ubun ...
- (转)CentOS 日志分析
1.了解日志文件 linux的日志文件可以说是最有用的了,日志文件可以让我们了解系统所处的状态,比如能查出哪些用户有登入,这也涉及相关的安全问题.如果我们不懂得分析日志,可能我们都不知道有些用 ...
- Ubuntu教程
Ubuntu的发音 Ubuntu,源于非洲祖鲁人和科萨人的语言,发作 oo-boon-too 的音.了解发音是有意义的,您不是第一个为此困惑的人,当然,也不会是最后一个:) 大多数的美国人读 ubun ...
- Laravel5 (cli)命令行执行脚本及定时任务
Artisan是Laravel自带的命令行接口名称,它提供了很多有用的命令想要查看所有可用的Artisan命令,可使用list命令查看: 1 php artisan list 每个命令都可以用help ...
随机推荐
- centos7下安装docker(12.4容器如何与外部进行通信)
1.容器如何访问外部 前面我们做了很多试验:只要host能连外网,使用默认bridge(docker0)创建得容器就能访问外网,那么容器是怎样访问外网的呢? 注:这里的外网不仅是internet,包括 ...
- 大疆ganluinace
1全部套件 2 贴胶布 3 注意箭头朝向一直 5 安装分部件
- openzeppelin-solidity/contracts的代码学习——access
https://github.com/OpenZeppelin/openzeppelin-solidity/tree/master/contracts/access access - Smart co ...
- fatal error LNK1169: 找到一个或多个多重定义的符号或多个.c/.cpp文件想同时调用定义在.h文件里面的全局变量,防止重定义变量问题。
为什么.h文件中不能定义全局变量? 原因: 存在多次创建变量.如果头文件中可以定义全局变量,那么每个包含该头文件的文件里都会有该全局变量的定义.因为C语言的include是直接将文件嵌入到includ ...
- Android java.lang.RuntimeException: Unable to instantiate activity ComponentInfo 特殊异常
本来是不想写的,因为这个异常太常见了,而且也容易处理.但是还是决定记录一下,因为之前遇到过,没留心,今天又遇到了,苦逼了,想了好大一会儿才想起来. 通常容易找的就不写了,今天写个特殊的. 现象:当你在 ...
- linux调度器源码分析 - 初始化(二)
本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 引言 上期文章linux调度器源码分析 - 概述(一)已经把调度器相关的数据结构介绍了一遍,本篇着重通过代码说明 ...
- Android Studio复制项目作为一个新的工程
Android Studio复制项目作为一个新的工程 等待..... 好了 可能会安装失败 Failed to finalize session : INSTALL_FAILED_INVALID_AP ...
- Linux tar 解压 压缩(转)
注:tar是打包,不是压缩!) 解包: tar xvf FileName.tar 打包:tar cvf FileName.tar DirName .tar.gz 解压:tar zxvf FileN ...
- [Spark][Python]DataFrame select 操作例子II
[Spark][Python]DataFrame中取出有限个记录的 继续 In [4]: peopleDF.select("age","name") In ...
- .net mvc数据库操作添加数据的几中方法
1. Defining sets on a derived context 1) DbSet属性:指定集合为Entity类型 2) IDbSet属性 3) 只读set属性 public IDbSet& ...