DotNetCore跨平台~Quartz定时单次任务
之前写过一篇文件《DotNetCore跨平台~Quartz热部署的福音~监控文件夹的变化》,今天主要把框架优化了一下,支持外部触发,并支持外部将参数以JobDataMap形式进行输入,然后在咱们的Job里进行使用它,故称参数化任务。
Quartz使用场景:
- 定时单次任务:在未来某个时间去执行一次
- 定点任务 :在某个时间去执行,可以是轮询的
- 周期任务 :按某个时间间隔去轮询执行
今天说的外部触发的任务是指第一种,即在未来某个时间点去执行,并且只执行一次。说一下思路,这种任务某个JobBase的子类,它需要重写属性IsSingle,将值设为1表示单次任务,然后在Quartz启动后,它会被立即执行,执行完成后,销毁!
用例:你可以在quartz调度中心里对外公开一些方法,让你的Job依赖于某个时间点和参数去执行,执行一次就停止,这样我们的调度就更加灵活了。
为单次任务添加了IsSingle属性
[DisallowConcurrentExecution()]
public abstract class JobBase : ISchedulingJob
{
#region Properties /// <summary>
/// 取消资源
/// </summary>
public CancellationTokenSource CancellationSource => new CancellationTokenSource(); /// <summary>
/// 执行计划,除了立即执行的JOB之后,其它JOB需要实现它
/// </summary>
public virtual string Cron => "* * * * * ?"; /// <summary>
/// 是否为单次任务,黑为false
/// </summary>
public virtual bool IsSingle => false; /// <summary>
/// Job的名称,默认为当前类名
/// </summary>
public virtual string JobName => GetType().Name; /// <summary>
/// Job执行的超时时间(毫秒),默认5分钟
/// </summary>
public virtual int JobTimeout => * * ; #endregion Properties #region Methods /// <summary>
/// Job具体类去实现自己的逻辑
/// </summary>
protected abstract void ExcuteJob(IJobExecutionContext context, CancellationTokenSource cancellationSource); /// <summary>
/// 当某个job超时时,它将被触发,可以发一些通知邮件等
/// </summary>
/// <param name="arg"></param>
private void CancelOperation(object arg)
{
CancellationSource.Cancel();
StdSchedulerFactory.GetDefaultScheduler().Result.Interrupt(new JobKey(JobName));
Console.WriteLine(JobName + "Job执行超时,已经取消,等待下次调度...");
} #endregion Methods #region IJob 成员 public Task Execute(IJobExecutionContext context)
{
Timer timer = null;
try
{
timer = new Timer(CancelOperation, null, JobTimeout, Timeout.Infinite);
Console.WriteLine(DateTime.Now.ToString() + "{0}这个Job开始执行", context.JobDetail.Key.Name);
if (context.JobDetail.JobDataMap != null)
{
foreach (var pa in context.JobDetail.JobDataMap)
Console.WriteLine($"JobDataMap,key:{pa.Key},value:{pa.Value}");
}
ExcuteJob(context, CancellationSource);
}
catch (Exception ex)
{
Console.WriteLine(this.GetType().Name + "error:" + ex.Message);
}
finally
{
if (timer != null) timer.Dispose();
}
return Task.CompletedTask;
} #endregion
}
统一的加入Job队列的方法
在我们之前的QuartzManager管理者中,我们需要添加对单次任务的支持,这点我们将任务加入到quartz的代码进行了重构,提取到了方法里。
/// <summary>
/// 将类型添加到Job队列
/// </summary>
/// <param name="type">类型</param>
/// <param name="dt">时间点</param>
/// <param name="param">参数</param>
private static void JoinToQuartz(Type type, DateTimeOffset dt, Dictionary<string, object> param = null)
{
var obj = Activator.CreateInstance(type);
if (obj is ISchedulingJob)
{
var tmp = obj as ISchedulingJob;
string cron = tmp.Cron;
string name = tmp.JobName;
var cancel = tmp.CancellationSource; var jobDetail = JobBuilder.Create(type)
.WithIdentity(name)
.Build();
if (param != null)
foreach (var dic in param)
jobDetail.JobDataMap.Add(dic.Key, dic.Value); ITrigger jobTrigger;
if (tmp.IsSingle)
{
jobTrigger = TriggerBuilder.Create()
.WithIdentity(name + "Trigger")
.StartAt(dt)
.Build();
}
else
{
jobTrigger = TriggerBuilder.Create()
.WithIdentity(name + "Trigger")
.StartNow()
.WithCronSchedule(cron)
.Build();
}
StdSchedulerFactory.GetDefaultScheduler().Result.ScheduleJob(jobDetail, jobTrigger, cancel.Token);
LoggerInfo($"->任务模块{name}被装载...", ConsoleColor.Yellow);
}
}
对外公开的参数化接口
而对于外界如果希望再次触发这个单次任务,我们可以在QuartzManager里公开一个方法,用来向当前SchedulerFactory里添加新的Job就可以了,这个方法很简单,可以提供一个默认的时间策略,如默认为1分钟后执行,也可以自己控制时间。
/// <summary>
/// 任务在1分钟之后被执行1次
/// </summary>
/// <param name="type"></param>
/// <param name="job"></param>
/// <param name="param"></param>
public static void SignalJob(Type type, Dictionary<string, object> param)
{
SignalJob(type, DateTimeOffset.Now.AddSeconds(), param);
} /// <summary>
/// 任务在某个时间之后被执行1次
/// </summary>
/// <param name="type"></param>
/// <param name="job"></param>
/// <param name="offset"></param>
/// <param name="param"></param>
public static void SignalJob(Type type, DateTimeOffset offset, Dictionary<string, object> param)
{
JoinToQuartz(type, offset);
}
那么,现在某个任务调度中心就更加完善了,开发人员在使用时也很简单,只要继承JobBase,或者去实现ISchedulingJob接口就可以了,非常灵活!
感谢各位的阅读!
quartz,dotnet core我们还在继续研究的路上!
DotNetCore跨平台~Quartz定时单次任务的更多相关文章
- DotNetCore跨平台~Quartz热部署的福音~监控文件夹的变化
在DotNetCore出来之后,同时也使用了quartz进行调度中心的设计,将它做到docker里方便部署,在之前的quartz版本里支持配置文件的方式,而现在不支持了,我们应该去想一下,为什么不去支 ...
- java 多线程——quartz 定时调度的例子
java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...
- 项目一:第十四天 1.在realm中动态授权 2.Shiro整合ehcache 缓存realm中授权信息 3.动态展示菜单数据 4.Quartz定时任务调度框架—Spring整合javamail发送邮件 5.基于poi实现分区导出
1 Shiro整合ehCache缓存授权信息 当需要进行权限校验时候:四种方式url拦截.注解.页面标签.代码级别,当需要验证权限会调用realm中的授权方法 Shiro框架内部整合好缓存管理器, ...
- Quartz定时调度框架
Quartz定时调度框架CronTrigger时间配置格式说明 CronTrigger时间格式配置说明 CronTrigger配置格式: 格式: [秒] [分] [小时] [日] [月] [周] [年 ...
- spring利用javamail,quartz定时发送邮件 <转>
原文地址:spring利用javamail,quartz定时发送邮件 <转>作者:物是人非 spring提供的定时发送邮件功能,下面是一个简单的例子以供大家参考,首先从spring配置文件 ...
- Spring+quartz集群配置,Spring定时任务集群,quartz定时任务集群
Spring+quartz集群配置,Spring定时任务集群,quartz定时任务集群 >>>>>>>>>>>>>> ...
- DotNetCore跨平台~文章索引~永久更新
本索引目录主要包括仓储大叔对dotnet core架构的研究与知识积累,从2016年开始进行撰写,到今天已经有一年多了,其中有一些小知识,小技巧,小应用,希望给大家在开发时一些启发,也希望dotnet ...
- DotNetCore跨平台~Dapper的使用
回到目录 Dapper作为小型ORM的代表作品被我们应用到了dotnet core的项目中,下面将把自己在项目中使用dapper进行curd操作的过程写一下,后期可能会遇到一些问题,大叔也会在这个系列 ...
- DotNetCore跨平台~聊聊中间件
回到目录 在进行.net core平台之后,我们如果希望在请求过程中添加一些事件是非常容易的,你可以把这些事件做成一个中间件Middleware,然后这些中间件就会以Http pipeline的管道方 ...
随机推荐
- APMServ中的 Apache无法启动…
情况1. 找问题:C:\APMServ5.2.6\Apache\bin点击httpd.exe 会出现: path is invalid.(地址无效) 解决办法:找到C:/APMServ5.2.6/Ap ...
- 这是个巧妙的表达式: a ˆ= b ˆ= a ˆ= b 它不需要临时变量就可 以交换 a 和 b 的值。
这不具有可移植性.它试图在序列点之间两次修改变量 a, 而这是无定义的. 例如,有人报告如下代码: int a = 123, b = 7654; a ^= b ^= a ^= b; 在 SCO 优化 ...
- 带有WS-Security验证的webservice
示例用的是spring+CXF来配置webservice 首先是web.xml配置,将spring,CXF的配置文件加载进去,由于我客户端跟服务端在同一个工程里面,所以配置文件在一块. <con ...
- 总结jq的一些特效
Jquery代码总结 1.轮播图: <script src="jquery-1.8.3.min.js"></script><script> ...
- nodejs 文件读取一行
作者QQ:1095737364 QQ群:123300273 欢迎加入! 废话没有,直接上代码: app.get('/company', function (req, res, nex ...
- 每日Linux命令(1)-date
显示日期指令:date 1.如果想知道Linux系统的时间,那么可以在shell终端直接输入date命令,时间就会反白显示在终端. ysxy@ubuntu:~$ date Tue Aug :: CST ...
- easyui&8Jquery ztree树插件
7Jquery easyui前台UI框架 开发包: 7.1Layout页面布局 将课后资料中后台系统前台页面素材导入项目中 1.导入Jquery,easyui相关js,css文件 <link r ...
- 王佩丰第一讲 认识excel笔记
改变工作表表浅颜色 批量插入工作表 选择多张工作表然后插入 找到表格边界区域快捷键(找到表格的最后一行):快速到达最上下左右端 点击边框上下左右双击 从指定的位置开始冻结窗格 输入今天的日期 快捷键c ...
- CSS3自定义滚动条样式
原文地址:→传送门 写在前面 滚动条是个很常见的东东,不过某些浏览器自带的滚动条确实不太好看啊,下面可以作为学习,探讨下自定义滚动条的实现,这样你的滚动条就可以美美的啦.但是,也只能玩玩,因为只针对w ...
- Vue过渡效果之JS过渡
前面的话 与CSS过渡不同,JS过渡主要通过事件进行触发.本文将详细介绍Vue过渡效果之JS过渡 事件钩子 JS过渡主要通过事件监听事件钩子来触发过渡,共包括如下的事件钩子 <transitio ...