QuartzNet3.0实现作业调度
Quartz是一个完全由JAVA编写的开源作业调度框架。
Quartz.NET是Quartz的.NET移植,它用C#写成,可用于.Net以及.Net Core的应用中。
目前最新的quartz.net版本3.0.6 只支持.netframework4.5.2及.netstandard2.0及以上版本
官方实例:https://www.quartz-scheduler.net/documentation/quartz-3.x/quick-start.html
- using Quartz;
- using Quartz.Impl;
- using Quartz.Logging;
- using System;
- using System.Collections.Generic;
- using System.Collections.Specialized;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace Demo
- {
- class Program
- {
- private static void Main(string[] args)
- {
- LogProvider.SetCurrentLogProvider(new ConsoleLogProvider());
- RunProgramRunExample().GetAwaiter().GetResult();
- Console.WriteLine("Press any key to close the application");
- Console.ReadKey();
- }
- private static async Task RunProgramRunExample()
- {
- try
- {
- // Grab the Scheduler instance from the Factory
- NameValueCollection props = new NameValueCollection
- {
- { "quartz.serializer.type", "binary" }
- };
- StdSchedulerFactory factory = new StdSchedulerFactory(props);
- IScheduler scheduler = await factory.GetScheduler();
- // and start it off
- await scheduler.Start();
- // define the job and tie it to our HelloJob class
- IJobDetail job = JobBuilder.Create<HelloJob>()
- .WithIdentity("job1", "group1")
- .Build();
- // Trigger the job to run now, and then repeat every 10 seconds
- ITrigger trigger = TriggerBuilder.Create()
- .WithIdentity("trigger1", "group1")
- .StartNow()
- .WithSimpleSchedule(x => x
- .WithIntervalInSeconds()
- .RepeatForever())
- .Build();
- // Tell quartz to schedule the job using our trigger
- await scheduler.ScheduleJob(job, trigger);
- // some sleep to show what's happening
- await Task.Delay(TimeSpan.FromSeconds());
- // and last shut down the scheduler when you are ready to close your program
- await scheduler.Shutdown();
- }
- catch (SchedulerException se)
- {
- Console.WriteLine(se);
- }
- }
- // simple log provider to get something to the console
- private class ConsoleLogProvider : ILogProvider
- {
- public Logger GetLogger(string name)
- {
- Logger loger = LoggerMethod;
- return loger;
- return (level, func, exception, parameters) =>
- {
- if (level >= LogLevel.Info && func != null)
- {
- Console.WriteLine("[" + DateTime.Now.ToLongTimeString() + "] [" + level + "] " + func(), parameters);
- }
- return true;
- };
- }
- private bool LoggerMethod(LogLevel logLevel, Func<string> messageFunc, Exception exception = null, params object[] formatParameters)
- {
- if (logLevel >= LogLevel.Info && messageFunc != null)
- {
- Console.WriteLine("[" + DateTime.Now.ToLongTimeString() + "] [" + logLevel + "] " + messageFunc(), formatParameters);
- }
- return true;
- }
- public IDisposable OpenNestedContext(string message)
- {
- throw new NotImplementedException();
- }
- public IDisposable OpenMappedContext(string key, string value)
- {
- throw new NotImplementedException();
- }
- }
- }
- public class HelloJob : IJob
- {
- public async Task Execute(IJobExecutionContext context)
- {
- await Console.Out.WriteLineAsync("Greetings from HelloJob!");
- }
- }
- }
看了这个官方的示例,你会发现QuarztNet3.0版本较之2.0版本,引入了async/await
下面记录一下学习过程:
一、使用VS2013新建Winform项目,.Net版本为4.5.2,通过Nuget命令行获取Quarzt.Net:Install-Package Quartz. 如果你在安装过程中报错,那么,要注意你的.Net版本
二、万事俱备,开始编码
多任务,一个每分钟的第30秒播放音频,一个每分钟的第0秒写文本文件
- private async void PlaySound()
- {
- //1.通过工厂获取一个调度器的实例
- StdSchedulerFactory factory = new StdSchedulerFactory();
- _scheduler = await factory.GetScheduler();
- await _scheduler.Start();
- //创建任务对象
- IJobDetail job = JobBuilder.Create<SoundJob>()
- .WithIdentity("job1", "group1")
- .Build();
- //创建触发器
- ITrigger trigger = TriggerBuilder.Create()
- .WithIdentity("trigger1", "group1")
- .StartNow()
- .WithCronSchedule("30 0/1 * * * ?")//每分钟的第30秒执行
- .Build();
- //将任务加入到任务池
- await _scheduler.ScheduleJob(job, trigger);
- job = JobBuilder.Create<PrintJob>()
- .WithIdentity("job2", "group1")
- .Build();
- trigger = TriggerBuilder.Create()
- .WithIdentity("trigger2", "group1")
- .StartNow()
- .WithCronSchedule("0 0/1 * * * ?")//每分钟的第0秒执行
- .Build();
- await _scheduler.ScheduleJob(job, trigger);
- }
- public class PrintJob : IJob
- {
- string fileName = "printlog.txt";
- public Task Execute(IJobExecutionContext context)
- {
- StreamWriter writer = new StreamWriter(fileName, true);
- Task task = writer.WriteLineAsync(string.Format("{0}", DateTime.Now.ToLongTimeString()));
- writer.Close();
- writer.Dispose();
- return task;
- }
- }
- public class SoundJob : IJob
- {
- public static Action<string> _printLogCallBack;
- public string Sound { get; set; }
- public Task Execute(IJobExecutionContext context)
- {
- JobDataMap jobDataMap = context.JobDetail.JobDataMap;
- string sound = jobDataMap.GetString("sound");
- int number = jobDataMap.GetInt("number");
- if (_printLogCallBack != null)
- { _printLogCallBack(string.Format("{0}[{1}] 执行任务 Sound {2}", Environment.NewLine, DateTime.Now.ToLongTimeString(), Sound)); }
- return Task.Factory.StartNew(() =>
- {
- SoundPlayer player = new SoundPlayer();
- player.SoundLocation = @"F:\FFOutput\421204264234974-.wav";
- player.Load();
- player.Play();
- });
- }
- }
以上是主要部分,另外还涉及到日志部分,日志我是直接输出到UI上,我们可以看到以下编码的区别,ConsoleLogProvider中输出的日志可以直接打印,而SoundJob中的却不可以,说明SoundJob中的方法是异步执行的,需要解决跨线程访问UI控件的问题,我们可以使用UI线程的上下文对象SynchronizationContext _syncContext,将输出日志的方法,委托给UI线程执行。
- private void Form1_Load(object sender, EventArgs e)
- {
- ConsoleLogProvider logProvider = new ConsoleLogProvider();
- logProvider.SetLogCallBack((log) =>
- {
- this.rchMessage.AppendText(log);
- });
- SoundJob._printLogCallBack = (log) =>
- {
- _syncContext.Send((obj) =>
- {
- this.rchMessage.AppendText(log.ToString());
- }, null);
- };
- LogProvider.SetCurrentLogProvider(logProvider);
- }
关于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’
- */
运行效果图:
QuartzNet3.0实现作业调度的更多相关文章
- ZAM 3D 制作简单的3D字幕 流程(二)
原地址:http://www.cnblogs.com/yk250/p/5663907.html 文中表述仅为本人理解,若有偏差和错误请指正! 接着 ZAM 3D 制作简单的3D字幕 流程(一) .本篇 ...
- ZAM 3D 制作3D动画字幕 用于Xaml导出
原地址-> http://www.cnblogs.com/yk250/p/5662788.html 介绍:对经常使用Blend做动画的人来说,ZAM 3D 也很好上手,专业制作3D素材的XAML ...
- 微信小程序省市区选择器对接数据库
前言,小程序本身是带有地区选着器的(网站:https://mp.weixin.qq.com/debug/wxadoc/dev/component/picker.html),由于自己开发的程序的数据是很 ...
- osg编译日志
1>------ 已启动全部重新生成: 项目: ZERO_CHECK, 配置: Debug x64 ------1> Checking Build System1> CMake do ...
- 作业调度框架 Quartz.NET 2.0 StepByStep
注:目前网上诸多介绍Quartz.net的文章,甚至Quartz.net官网上的Tutorial都是1.0版本的,而这个项目在2.0版本对项目进行了比较大规模的修改,使得原有的很多例子都不能运行,故写 ...
- Quartz.NET 2.0 作业调度框架使用
Quartz.NET是一个开源的作业调度框架,是 OpenSymphony 的 Quartz API 的.NET移植,它用C#写成,可用于winform和asp.net应用中.它提供了巨大的灵活性而不 ...
- Quartz.NET实现作业调度(3.0版本实现)定时执行一个任务
2.0版本请参考https://www.cnblogs.com/best/p/7658573.html这里的文章很详细: 我们现在想每5秒钟往txt文件夹里存储一个时间 首先:定义一个类,实现Quar ...
- Asp.Net Core2.0 基于QuartzNet任务管理系统
Quartz.NET官网地址:https://www.quartz-scheduler.net/ Quartz.NET文档地址:https://www.quartz-scheduler.net/doc ...
- Spark核心作业调度和任务调度之DAGScheduler源码
前言:本文是我学习Spark 源码与内部原理用,同时也希望能给新手一些帮助,入道不深,如有遗漏或错误的,请在原文评论或者发送至我的邮箱 tongzhenguotongzhenguo@gmail.com ...
随机推荐
- 批量删除进程清理 minerd
发现顽固minerd 进程与ntp一起启动,所以一起杀掉 yum remove ntp kill -9 `ps -ef | grep ntp|awk '{print $2}'` kill -9 `ps ...
- asp.net 关于Response.Redirect重定向前无法弹出alert对话框的问题
要实现的功能:某项操作后,使用alert()提示框提示"操作成功"之类的提示,然后使用response.Redirect()来进行页面重定向. 出现的问题:运行代码,操作完成后,直 ...
- TZOJ 2755 国际象棋(广搜+哈希)
描述 在n*n的国际象棋棋盘中,给定一“马(Knight)”和一“后(Queen)”的位置,问“马”能否在m步之内(包括m步)到达“后”的位置?马的走法是:每步棋先横走或直走一格,然后再斜走一格,即走 ...
- 查看端口号根据pid号找到相关占用端口应用
查看端口号根据pid号找到相关占用端口应用 8080 端口被占用不知道被哪个应用软件占用,下面我来教你查出那个该死的应用 方法/步骤 1 首先用netstat 找到端口对应的pid号,找到之后 ...
- access数据库收缩(压缩)
一般是因为表中有大量没用的数据,把没用的数据全部删除 菜单栏的“工具”——“数据库实用工具”——“压缩和修复数据库” OK啦
- iOS - xcode - label 字体自动根据宽高 显示完全
1. label 左右约束要给. 2.代码实现label.adjustsFontSizeToFitWidth = YES
- 坑爹的HP
昨天晚上帮人远程修理电脑,情况是这样的: HP CQ45笔记本, 比较老的机器, win32 xp sp3 系统, 突然发现没有声音了,而且右下角也没有出现小喇叭图标. 处理过程: 1.先查看了控制面 ...
- Docker commit 制作weblogic镜像
第一:前提条件 1.本机必须已经安装了docker 容器 2.pull 一个基础的镜像 如图:rastasheep/ubuntu-sshd 第二:利用docker commit 命令 将容器的状态 ...
- Django之ORM数据库
5.1 数据库的配置 1 django默认支持sqlite,mysql, oracle,postgresql数据库. <1> sqlite django默认使用sqlite的数据库 ...
- Laravel + Vue 之 OPTIONS 请求的处理
问题: 在 Vue 对后台的请求中,一般采用 axios 对后台进行 Ajax 交互. 交互发生时,axios 一般会发起两次请求,一次为 Options 试探请求,一次为正式请求. 由此带来的问题是 ...