定时任务 Wpf.Quartz.Demo.1
Quartz 是个开源的作业调度框架.
安装:Install-Package Quartz
官网文档地址:https://www.quartz-scheduler.net/documentation/quartz-3.x/tutorial/using-quartz.html
资源比较多,这里不做介绍。
任务设置有两种方式:SimpleTrigger和CronTrigger,如下:
var trigger = (ISimpleTrigger) TriggerBuilder.Create()
.WithIdentity("trigger1", "group1")
.StartAt(myStartTime) // some Date
.ForJob("job1", "group1") // identify job with name, group strings
var trigger = TriggerBuilder.Create()
.WithIdentity("trigger3", "group1")
.WithCronSchedule("0 0/2 8-17 * * ?")
.ForJob("myJob", "group1")
.Build();
第二种的在线表达式生成工具网址:http://cron.qqe2.com/
在这里写个控制台的Demo来看看定时任务的效果,我们先简单的封装一下任务的启动和停止等,主要代码如下:
public class QuartzHelper
{
private static QuartzHelper instance = new QuartzHelper(); public static QuartzHelper Instance
{
get
{
if (instance == null)
{
instance = new QuartzHelper();
}
return instance;
}
} private const string JOB_GROUP_NAME = "JOB_GROUP_NAME";
private const string TRIGGER_GROUP_NAME = "TRIGGER_GROUP_NAME"; /// <summary>
/// 程序调度
/// </summary>
private static IScheduler _scheduler; /// <summary>
/// 初始化任务调度对象
/// </summary>
private QuartzHelper()
{ } /// <summary>
/// 时间间隔执行任务
/// </summary>
/// <typeparam name="T">任务类,必须实现IJob接口</typeparam>
/// <param name="seconds">时间间隔(单位:毫秒)</param>
public async Task StartJobExecuteInterval<T>(int seconds, string jobName = null, string jobGroupName = null, string triggerName = null, string triggerGroupName = null) where T : IJob
{
await InitJobs(); //IJobDetail job = JobBuilder.Create<T>().WithIdentity("job1", "group1").Build();
IJobDetail job = JobBuilder.Create<T>().Build(); ITrigger trigger = TriggerBuilder.Create()
.StartNow()
.WithSimpleSchedule(x => x.WithIntervalInSeconds(seconds).RepeatForever())
.Build(); await _scheduler.ScheduleJob(job, trigger); await _scheduler.Start();
} /// <summary>
/// 指定时间执行任务
/// </summary>
/// <typeparam name="T">任务类,必须实现IJob接口</typeparam>
/// <param name="cronExpression">cron表达式,即指定时间点的表达式</param>
public async Task<TriggerState> StartJobExecuteByCron<T>(string cronExpression, string jobName, object para = null, DateTime? startTime = null, DateTime? endTime = null, string jobGroupName = JOB_GROUP_NAME, string triggerName = null, string triggerGroupName = TRIGGER_GROUP_NAME) where T : IJob
{
await InitJobs(); IJobDetail job = JobBuilder.Create<T>()
.WithIdentity(jobName, jobGroupName)
.Build();
job.JobDataMap.Put("Runner", para); ITrigger trigger;
if (startTime == null && endTime == null)
{
trigger = TriggerBuilder.Create()
.WithIdentity(triggerName ?? jobName, triggerGroupName)
.WithCronSchedule(cronExpression)
.Build();
}
else if (startTime != null && endTime == null)
{
trigger = TriggerBuilder.Create()
.WithIdentity(triggerName ?? jobName, triggerGroupName)
.StartAt(CronHelper.DateTime2DateTimeOffset(startTime.Value))
.WithCronSchedule(cronExpression)
.Build();
}
else if (startTime == null && endTime != null)
{
trigger = TriggerBuilder.Create()
.WithIdentity(triggerName ?? jobName, triggerGroupName)
.EndAt(CronHelper.DateTime2DateTimeOffset(endTime.Value))
.WithCronSchedule(cronExpression)
.Build();
}
else
{
trigger = TriggerBuilder.Create()
.WithIdentity(triggerName ?? jobName, triggerGroupName)
.StartAt(CronHelper.DateTime2DateTimeOffset(startTime.Value))
.EndAt(CronHelper.DateTime2DateTimeOffset(endTime.Value))
.WithCronSchedule(cronExpression)
.Build();
} await _scheduler.ScheduleJob(job, trigger); await _scheduler.Start(); return await _scheduler.GetTriggerState(trigger.Key);
} public async Task<TriggerState> ModifyJobTime(string cronExpression, string jobName, string jobGroupName = JOB_GROUP_NAME, string triggerName = null, string triggerGroupName = TRIGGER_GROUP_NAME)
{
IJobDetail job;
ITrigger trigger; job = await _scheduler.GetJobDetail(new JobKey(jobName, jobGroupName));
trigger = await _scheduler.GetTrigger(new TriggerKey(triggerName ?? jobName, triggerGroupName));
if (job == null || trigger == null)
{
return TriggerState.None;
} await _scheduler.UnscheduleJob(trigger.Key); trigger = TriggerBuilder.Create()
.WithIdentity(trigger.Key.Name, trigger.Key.Group)
.WithCronSchedule(cronExpression)
.Build(); await _scheduler.ScheduleJob(job, trigger); return await _scheduler.GetTriggerState(trigger.Key);
} public async Task<TriggerState> RemoveJob(string jobName, string jobGroupName = JOB_GROUP_NAME, string triggerName = null, string triggerGroupName = TRIGGER_GROUP_NAME)
{ IJobDetail job;
ITrigger trigger; job = await _scheduler.GetJobDetail(new JobKey(jobName, jobGroupName));
trigger = await _scheduler.GetTrigger(new TriggerKey(triggerName ?? jobName, triggerGroupName));
if (job == null || trigger == null)
{
return TriggerState.None;
} await _scheduler.UnscheduleJob(trigger.Key);
await _scheduler.DeleteJob(job.Key); return await _scheduler.GetTriggerState(trigger.Key);
} public async Task<TriggerState> PauseJob(string jobName, string jobGroupName = JOB_GROUP_NAME, string triggerName = null, string triggerGroupName = TRIGGER_GROUP_NAME)
{
IJobDetail job;
ITrigger trigger; job = await _scheduler.GetJobDetail(new JobKey(jobName, jobGroupName));
trigger = await _scheduler.GetTrigger(new TriggerKey(triggerName ?? jobName, triggerGroupName));
if (job == null || trigger == null)
{
return TriggerState.None;
} await _scheduler.PauseJob(job.Key); return await _scheduler.GetTriggerState(trigger.Key);
} public async Task<TriggerState> ResumeJob(string jobName, string jobGroupName = JOB_GROUP_NAME, string triggerName = null, string triggerGroupName = TRIGGER_GROUP_NAME)
{
IJobDetail job;
ITrigger trigger; job = await _scheduler.GetJobDetail(new JobKey(jobName, jobGroupName));
trigger = await _scheduler.GetTrigger(new TriggerKey(triggerName ?? jobName, triggerGroupName));
if (job == null || trigger == null)
{
return TriggerState.None;
} await _scheduler.ResumeJob(job.Key); return await _scheduler.GetTriggerState(trigger.Key);
} public async Task<TriggerState> GetJobState(string jobName, string jobGroupName = JOB_GROUP_NAME, string triggerName = null, string triggerGroupName = TRIGGER_GROUP_NAME)
{
IJobDetail job;
ITrigger trigger; job = await _scheduler.GetJobDetail(new JobKey(jobName, jobGroupName));
trigger = await _scheduler.GetTrigger(new TriggerKey(triggerName ?? jobName, triggerGroupName));
if (job == null || trigger == null)
{
return TriggerState.None;
}
return await _scheduler.GetTriggerState(trigger.Key);
} public async Task InitJobs()
{
if (_scheduler != null)
{
return;
} //配置文件的方式,配置quartz实例
ISchedulerFactory schedulerFactory = new StdSchedulerFactory();
_scheduler = await schedulerFactory.GetScheduler();
} public async Task StartJobs()
{
if (_scheduler != null)
{
await _scheduler.Start(); return;
} //配置文件的方式,配置quartz实例
ISchedulerFactory schedulerFactory = new StdSchedulerFactory();
_scheduler = await schedulerFactory.GetScheduler();
await _scheduler.Start();
} public void StandbyJobs()
{
try
{
if (_scheduler == null) return;
if (!_scheduler.InStandbyMode)
{
_scheduler.Standby();
}
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
} public void RestartJobs()
{
_scheduler.Shutdown();
_scheduler.Start();
} public DateTime[] GetNextRunTime(string cronExpression, DateTime? startTime,DateTime? endTime, int number = )
{
try
{
ITrigger trigger = null;
if (startTime == null && endTime == null)
{
trigger = TriggerBuilder.Create()
.WithCronSchedule(cronExpression)
.Build();
}
else if (startTime != null && endTime == null)
{
trigger = TriggerBuilder.Create()
.StartAt(CronHelper.DateTime2DateTimeOffset(startTime.Value))
.WithCronSchedule(cronExpression)
.Build();
}
else if (startTime == null && endTime != null)
{
trigger = TriggerBuilder.Create()
.EndAt(CronHelper.DateTime2DateTimeOffset(endTime.Value))
.WithCronSchedule(cronExpression)
.Build();
}
else
{
trigger = TriggerBuilder.Create()
.StartAt(CronHelper.DateTime2DateTimeOffset(startTime.Value))
.EndAt(CronHelper.DateTime2DateTimeOffset(endTime.Value))
.WithCronSchedule(cronExpression)
.Build();
} IList<DateTimeOffset> dates = TriggerUtils.ComputeFireTimes(trigger as IOperableTrigger, null, number).ToList();
if (dates != null && dates.Count > )
{
return dates.Select(p => TimeZoneInfo.ConvertTimeFromUtc(p.DateTime, TimeZoneInfo.Local)).ToArray();
}
}
catch (Exception ex)
{ }
return null;
}
}
执行一个每5s执行一次的例子如下:
var TriggerState = await QuartzHelper.Instance.StartJobExecuteByCron<HelloJob>("0/5 * * * * ?", "测试1");
代码下载地址如下:https://pan.baidu.com/s/1W1UwoFPgyfo_ETDpHeEGsg
定时任务 Wpf.Quartz.Demo.1的更多相关文章
- 定时任务 Wpf.Quartz.Demo.4
本文继续介绍定时任务 Wpf.Quartz.Demo.3的一些小细节, 代码也请前往第3节下载. 1.RichTextBox右键菜单 <RichTextBox.ContextMenu> ...
- 定时任务 Wpf.Quartz.Demo.2
定时任务 Wpf.Quartz.Demo.1已经能运行了,本节开始用wpf搭界面. 准备工作: 1.界面选择MahApp.Metro 在App.xaml添加资源 <Application.Res ...
- 定时任务 Wpf.Quartz.Demo.5 (升级版)
老规矩:先把全部源码上传,见本文底部. 相对于Demo3的区别,就是能自动加载继承了IJob的任务,任务主体程序分离. 在exe执行文件的同级下建一个MyJobs的文件夹,每次会自动扫描该文件夹下的J ...
- 定时任务 Wpf.Quartz.Demo.3
先把全部源码上传,只是一个Demo,希望大家指点一下不足之处,见本文底部. 1.设置界面 2.详情页面 好了,现在慢慢叙述里面的一些方法. 3.实现拷贝的方法: (1) public static v ...
- [转][JAVA]定时任务之-Quartz使用篇
[BAT][JAVA]定时任务之-Quartz使用篇 定时任务之-Quartz使用篇 Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与 ...
- Spring整合quartz2.2.3总结,quartz动态定时任务,Quartz定时任务集群配置
Spring整合quartz2.2.3总结,quartz动态定时任务,Quartz定时任务集群配置 >>>>>>>>>>>>&g ...
- 震惊!Windows Service服务和定时任务框架quartz之间原来是这种关系……
过场CG: 接到公司领导的文件指示,“小熊”需要在6月底去海外执行一个行动代号为[定时任务]的营救计划,这个计划关系到公司某个项目的生死(数据安全漏洞),作战部拟定两个作战方案: 方案一:使用务定 ...
- SpringBoot定时任务 - 集成quartz实现定时任务(单实例和分布式两种方式)
最为常用定时任务框架是Quartz,并且Spring也集成了Quartz的框架,Quartz不仅支持单实例方式还支持分布式方式.本文主要介绍Quartz,基础的Quartz的集成案例本,以及实现基于数 ...
- Spring 整合 Quartz 实现动态定时任务(附demo)
最近项目中需要用到定时任务的功能,虽然Spring 也自带了一个轻量级的定时任务实现,但感觉不够灵活,功能也不够强大.在考虑之后,决定整合更为专业的Quartz来实现定时任务功能. 普通定时任务 首先 ...
随机推荐
- 2019,UI设计师必备神器
2019年将会是你全新起航的一年,相信你已经制定了很多规划,正在开启第一步的推动. 作为对UI设计师更大程度的支持,今天特意为你分享一款释放你双手的设计神器.让你可以把时间和精力投入到设计本身,这 ...
- java连接数据库以及连接参数格式
//链接数据库代码部分 下面具有连接的基本参数可以对照修改(参数存放在file下面的database.properties下面) //参数存放在file下面的database.properties下 ...
- Sophus libSophus.so
在编译包含Sophus的源文件的时候,出现如下错误 ../lib/libmyslam.so: undefined reference to `Sophus::SO3::SO3(double, doub ...
- spring学习 八 面向切面编程(AOP)概述
注:本文大部分参考 --------------------- 本文来自 -望远- 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/yanquan345/artic ...
- canvas 实现太阳系效果
一:创建画布 <canvas width="1000" height="1000" id="solar" style="ba ...
- python学习 day18 (3月25日)---( 面向对象浅析)
面向对象思想: 字典表示对象: 不是太好 因为 变量 得一个个的赋值改值 {'name':'alex','blood':20,'attack':1,'sex':'不'} {'name':'太亮','b ...
- 2018.11.01 NOIP训练 树的排列(树形dp)
传送门 跟这道题差不多. 只不过是让权值小的儿子做权值大的儿子的父亲而已. 代码
- 关于Cell中的各种值的类型判断
switch (cell.getCellType()){ case Cell.CELL_TYPE_NUMERIC: //数字 cellValue = stringDateProcess(cell); ...
- Router pipeline
from 2013-HPCA-Breaking the On-Chip Latency Barrier Using SMART book_Principles and Practices of Int ...
- Keepalived+Nginx高可用架构配置
1.yum install -y libnfnetlink-devel2.yum -y install libnl libnl-devel 3.yum -y install openssl-devel ...