Quartz.Net的基础使用方法,多任务执行继续扩展
前一篇随笔讲了Quartz多任务的简单实现
Quartz.Net的基础使用方法,多任务执行
这一篇,来简单对前一篇进行一下简单的扩展
看了前一篇的代码会发现,每次新增一个任务还要去GetJobs方法里往任务列表新增一个任务
有没有一种简单的方法自动往任务列表去添加新增的任务呢?
从代码可以发现,所有的任务都必须继承IJob接口
public class Task_1 : IJob
1、我们定义一个接口IJobBase,继承IJob接口,并且新增一个执行时间间隔的属性
using Quartz; namespace HHF.Quartz
{
public interface IJobBase : IJob
{
/// <summary>
/// 执行时间间隔(秒)
/// </summary>
int seconds { get; set; }
}
}
2、使Task_1,Task_2继承IJobBase接口,并实现seconds属性
public class Task_1 : IJobBase
{
int s = ;
public int seconds { get { return s; } set { s = value; } }
public Task Execute(IJobExecutionContext context)
{
return Console.Out.WriteLineAsync($"这是任务一,执行时间:{DateTime.Now}");
}
}
3、先准备两个实体对象
/// <summary>
/// 任务明细
/// </summary>
public class TaskDetail
{
public IJobDetail job { get; set; }
public string key { get; set; }
public int seconds { get; set; }
}
/// <summary>
/// 类明细
/// </summary>
public class ClassDetail
{
public Type tasktype { get; set; }
public int seconds { get; set; }
}
4、根据类名获取类对象的方法
/// <summary>
/// 获取类对象
/// </summary>
/// <param name="assembly"></param>
/// <param name="className"></param>
/// <returns></returns>
public static object GetClassObj(Assembly assembly, string className)
{
// 从程序集中获取指定对象类型;
Type type = assembly.GetType(className);
Object obj = type.Assembly.CreateInstance(type.ToString());
return obj;
}
5、获取所有继承IJobBase接口类的方法
/// <summary>
/// 获取所有继承IJob的类
/// </summary>
/// <returns></returns>
public static List<ClassDetail> GetIJobTypes()
{
var res = new List<ClassDetail>();
//根据反射获取所有继承了IJobBase接口的类
var types = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(a => a.GetTypes().Where(t => t.GetInterfaces().Contains(typeof(IJobBase))))
.ToArray();
if (types.Length > )
{
for (int i = ; i < types.Length; i++)
{
// 类对象
var obj = GetClassObj(types[i].Assembly, types[i].FullName);
// 获取指定名称的属性,执行间隔时间
var propertyInfo = types[i].GetProperty("seconds");
// 获取属性值
int value = (int)propertyInfo.GetValue(obj, null); var entity = new ClassDetail();
entity.tasktype = types[i];
entity.seconds = value;
res.Add(entity);
}
}
return res;
}
6、生成执行任务集合的方法
/// <summary>
/// 获取执行的任务集合
/// </summary>
/// <returns></returns>
public static List<TaskDetail> GetJobs()
{
var list = new List<TaskDetail>();
var types = GetIJobTypes();
if (types.Count > )
{
for (int i = ; i < types.Count; i++)
{
var item = types[i];
var key = "job" + i;
var task = new TaskDetail();
IJobDetail job = JobBuilder.Create(item.tasktype).WithIdentity("job" + i).Build(); task.job = job;
task.key = key;
task.seconds = item.seconds; list.Add(task);
}
}
return list;
}
7、再对Run方法进行一点小小的改造
/// <summary>
/// 任务调度的使用过程
/// </summary>
/// <returns></returns>
public async static Task Run()
{
// 创建scheduler的引用
ISchedulerFactory schedFact = new StdSchedulerFactory();
IScheduler sched = await schedFact.GetScheduler(); // 所有任务集合
var jobs = TaskCollections.GetJobs();
// 申明一个任务与触发器映射的字典集合
var jobAndTriggerMapping = new Dictionary<IJobDetail, IReadOnlyCollection<ITrigger>>();
// 遍历任务列表
foreach (var job in jobs)
{
// 生成只读的触发器集合
var triggers = new ReadOnlyCollection<ITrigger>(
new List<ITrigger>(){
TriggerBuilder.Create()
.WithIdentity("trigger_" + job.key)
.WithSimpleSchedule(x => x.WithIntervalInSeconds(job.seconds).RepeatForever())
.Build() }); jobAndTriggerMapping[job.job] = triggers;
} // 将映射关系包装成制度字典集合
var readOnlyjobAndTriggerMapping = new ReadOnlyDictionary<IJobDetail, IReadOnlyCollection<ITrigger>>(jobAndTriggerMapping); /*
* 使用trigger规划执行任务job
*第二个参数replace:如果为true,则指定的触发器或者任务名称已经存在将会替换,否则将抛出异常
*/
await sched.ScheduleJobs(readOnlyjobAndTriggerMapping, true); //启动 scheduler
await sched.Start();
}
8、我们给任务一设置5秒执行间隔,任务二设置7秒执行间隔,启动看一看效果,正常执行

9、我们再添加一个Task_3,设置执行间隔为10秒看看效果

以上就是对Quartz一个比较简单的扩展,功能上比较粗糙,也算是一点小总结。后续,比如:可视化执行界面、自定义任务的开关操作等,都是可以作为扩展的内容。
Quartz.Net的基础使用方法,多任务执行继续扩展的更多相关文章
- 2019-1-29-Moq基础-判断方法被执行
title author date CreateTime categories Moq基础 判断方法被执行 lindexi 2019-01-29 16:29:57 +0800 2019-01-17 1 ...
- Quartz.Net的基础使用方法,单任务执行
1.先创建一个控制台应用程序 2.应用Quartz的NuGet包 3.编写执行任务代码 using System; using System.Threading.Tasks; using Quar ...
- Quartz.Net的基础使用方法,多任务执行
接着上面单任务执行的代码做一下简单的扩展 主要看下面这段代码,这是Quartz多任务调度的方法,主要就是围绕这个方法去扩展: // // 摘要: // Schedule all of the give ...
- Moq基础 判断方法被执行
如果想知道注入的类的某个方法被使用了几次,就可以通过 mock 提供的方法进行判断方法有没被执行或被使用多少次 本文是一个系列,具体请看 Moq基础(一) 为什么需要单元测试框架 Moq基础(二) 快 ...
- Spring+Quartz 实现定时任务的配置方法
Spring+Quartz 实现定时任务的配置方法 整体介绍 一.Quartz介绍 在企业应用中,我们经常会碰到时间任务调度的需求,比如每天凌晨生成前天报表,每小时生成一次汇总数据等等.Quartz是 ...
- 逆向与BOF基础——注入shellcode并执行&Return-to-libc
逆向与BOF基础--注入shellcode并执行 准备阶段 下载安装execstack. 本次实验实验的shellcode是心远的文章中生成的代码,即\x31\xc0\x50\x68\x2f\x2f\ ...
- Java 进阶7 并行优化 JDK多任务执行框架技术
Java 进阶7 并行优化 JDK多任务执行框架技术 20131114 Java 语言本身就是支持多线程机制的,他提供了 Thread 类 Runnable 接口等简单的多线程支持工 ...
- 千锋教育Vue组件--vue基础的方法
课程地址: https://ke.qq.com/course/251029#term_id=100295989 <!DOCTYPE html> <html> <head& ...
- SaltStack介绍——SaltStack是一种新的基础设施管理方法开发软件,简单易部署,可伸缩的足以管理成千上万的服务器,和足够快的速度控制,与他们交流
SaltStack介绍和架构解析 简介 SaltStack是一种新的基础设施管理方法开发软件,简单易部署,可伸缩的足以管理成千上万的服务器,和足够快的速度控制,与他们交流,以毫秒为单位.SaltSta ...
随机推荐
- SpingBoot整合jxls2.0-excel导出—— 列表循环,自定义方法,超链接等
Java中实现excel导出数据的方法有很多,一般简单的可以通过操作POI进行,但是复杂的excel格式导出如果用POI就显得非常麻烦,本文介绍的jxls2.0完全依据模板进行导出,只需要进行简单的配 ...
- Ethical Hacking - GAINING ACCESS(20)
CLIENT SIDE ATTACKS - Spoofing backdoor extension Change the extension of the trojan from exe to a s ...
- STL Stack(栈)学习笔记 + 洛谷 P1449 后缀表达式
稍微看了看刘汝佳的白皮书,“实用主义”的STL实在是香到我了,而且在实验室大佬的推荐下我开始了stl的学习. 每篇附带一个题目方便理解,那行,直接开始. 毕竟是实用主义,所以就按照给的题目的例子来理解 ...
- 设计模式:fly weight模式
目的:通过共享实例的方式来避免重复的对象被new出来,节约系统资源 别名:享元模式 例子: class Char //共享的类,轻量级 { char c; public: Char(char c) { ...
- Arrays.sort() ----- TimSort
Arrays.sort() Arrays.sort()对于基本类型使用的是DualPivotQuicksort双轴快速排序,而对于非基本类型使用的是TimSort,一种源自合并排序和插入排序的混合稳定 ...
- jmeter零散知识点
- vue+axios+springboot文件下载
//前台代码 <el-button size="medium" type="primary" @click="downloadFile" ...
- Android:自定义BaseActivity基类
使用BaseActivity可以封装一些重复代码例如设置标题栏颜色,封装一些工具类... 主要功能: 封装Toast 新建一个BaseActivity继承自Activity package com.o ...
- JS的执行上下文
定义 执行上下文时是代码执行时的环境,JS代码在运行前进行编译,那么会生成两部分,一部分是可执行的代码,而另一部分则是执行上下文. 发展 执行上下文所包含的内容是在不断的变化的.它主要分为了三个不同的 ...
- 7-Pandas之索引调整方法
一.调整索引.修改列标签 1.调整索引的两种情况: 重新索引 设置新的索引 (1)重新索引 在Pandas对象中,其实索引也是一个对象,所以可对其进行修改. 例如:df.index=['a','b', ...