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的更多相关文章

  1. 定时任务 Wpf.Quartz.Demo.4

    本文继续介绍定时任务 Wpf.Quartz.Demo.3的一些小细节, 代码也请前往第3节下载. 1.RichTextBox右键菜单 <RichTextBox.ContextMenu>   ...

  2. 定时任务 Wpf.Quartz.Demo.2

    定时任务 Wpf.Quartz.Demo.1已经能运行了,本节开始用wpf搭界面. 准备工作: 1.界面选择MahApp.Metro 在App.xaml添加资源 <Application.Res ...

  3. 定时任务 Wpf.Quartz.Demo.5 (升级版)

    老规矩:先把全部源码上传,见本文底部. 相对于Demo3的区别,就是能自动加载继承了IJob的任务,任务主体程序分离. 在exe执行文件的同级下建一个MyJobs的文件夹,每次会自动扫描该文件夹下的J ...

  4. 定时任务 Wpf.Quartz.Demo.3

    先把全部源码上传,只是一个Demo,希望大家指点一下不足之处,见本文底部. 1.设置界面 2.详情页面 好了,现在慢慢叙述里面的一些方法. 3.实现拷贝的方法: (1) public static v ...

  5. [转][JAVA]定时任务之-Quartz使用篇

    [BAT][JAVA]定时任务之-Quartz使用篇 定时任务之-Quartz使用篇 Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与 ...

  6. Spring整合quartz2.2.3总结,quartz动态定时任务,Quartz定时任务集群配置

    Spring整合quartz2.2.3总结,quartz动态定时任务,Quartz定时任务集群配置 >>>>>>>>>>>>&g ...

  7. 震惊!Windows Service服务和定时任务框架quartz之间原来是这种关系……

    过场CG:   接到公司领导的文件指示,“小熊”需要在6月底去海外执行一个行动代号为[定时任务]的营救计划,这个计划关系到公司某个项目的生死(数据安全漏洞),作战部拟定两个作战方案: 方案一:使用务定 ...

  8. SpringBoot定时任务 - 集成quartz实现定时任务(单实例和分布式两种方式)

    最为常用定时任务框架是Quartz,并且Spring也集成了Quartz的框架,Quartz不仅支持单实例方式还支持分布式方式.本文主要介绍Quartz,基础的Quartz的集成案例本,以及实现基于数 ...

  9. Spring 整合 Quartz 实现动态定时任务(附demo)

    最近项目中需要用到定时任务的功能,虽然Spring 也自带了一个轻量级的定时任务实现,但感觉不够灵活,功能也不够强大.在考虑之后,决定整合更为专业的Quartz来实现定时任务功能. 普通定时任务 首先 ...

随机推荐

  1. mapreduce的输入格式 --- InputFormat

    InputFormat 接口决定了mapreduce如何切分输入文件. InputFormat 由getspilit和createRecordReader组成,getspilit主要是标记分片的初始位 ...

  2. Ajax在jQuery中的应用 (4)向jsp提交表单数据

    ajax技术带给我们的是良好的用户体验,同时,使用jquery可以简化开发,提高工作效率. 下面就介绍一下大致的开发步骤. 工具/原料 本文中使用的是 jquery-1.3.2.min.js 方法/步 ...

  3. [C#.Net]启动外部程序的几种常用方法汇总

    本文汇总了C#启动外部程序的几种常用方法,非常具有实用价值,主要包括如下几种方法: 1. 启动外部程序,不等待其退出. 2. 启动外部程序,等待其退出. 3. 启动外部程序,无限等待其退出. 4. 启 ...

  4. Cisco interview

    A.  1. Self-introduction I am Yanlin He . I am a master degree candidate of school of infomation sci ...

  5. KAFKA 监控管理界面 KAFKA EAGLE 安装

    概述 Kafka Eagle监控系统是一款用来监控Kafka集群的工具,目前更新的版本是v1.2.3,支持管理多个Kafka集群.管理Kafka主题(包含查看.删除.创建等).消费者组合消费者实例监控 ...

  6. IntelliJ IDEA 2017版 使用笔记(十一) Debug操作:IDEA 快捷键

    调试功能;            缩短项目时间,调高阅读源码的能力.   一.添加断点,选中一行代码,双击即可生成断点(快捷键:ctrl+F8)                二.单步运行,快捷键:s ...

  7. redis-server进程CPU百分百问题

    结论:待确认是否为redis的BUG,原因是进程实际占用的内存远小于配置的最大内存,所以不会是内存不够需要淘汰.CPU百分百redis-server进程集群状态:slave临时解决办法:使用gdb将d ...

  8. MFC知识点

    1.获取应用程序实例句柄: AfxGetInstanceHandle(); 2.获取屏幕桌面窗口指针; GetDesktopWindow();

  9. Matlab绘图添加直角坐标轴

    绘制y=x^2,并添加直角坐标轴. clear;clc;close all %% 绘制方程 x = -10:0.01:10; figure; y = x.^2-30; plot(x,y,'k','li ...

  10. mysql查询 根据年月日的查询

    select * from call_loan_info where DATE_FORMAT(create_time,'%Y-%m-%d') = '2017-06-16'