前一篇随笔讲了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的基础使用方法,多任务执行继续扩展的更多相关文章

  1. 2019-1-29-Moq基础-判断方法被执行

    title author date CreateTime categories Moq基础 判断方法被执行 lindexi 2019-01-29 16:29:57 +0800 2019-01-17 1 ...

  2. Quartz.Net的基础使用方法,单任务执行

    1.先创建一个控制台应用程序  2.应用Quartz的NuGet包  3.编写执行任务代码 using System; using System.Threading.Tasks; using Quar ...

  3. Quartz.Net的基础使用方法,多任务执行

    接着上面单任务执行的代码做一下简单的扩展 主要看下面这段代码,这是Quartz多任务调度的方法,主要就是围绕这个方法去扩展: // // 摘要: // Schedule all of the give ...

  4. Moq基础 判断方法被执行

    如果想知道注入的类的某个方法被使用了几次,就可以通过 mock 提供的方法进行判断方法有没被执行或被使用多少次 本文是一个系列,具体请看 Moq基础(一) 为什么需要单元测试框架 Moq基础(二) 快 ...

  5. Spring+Quartz 实现定时任务的配置方法

    Spring+Quartz 实现定时任务的配置方法 整体介绍 一.Quartz介绍 在企业应用中,我们经常会碰到时间任务调度的需求,比如每天凌晨生成前天报表,每小时生成一次汇总数据等等.Quartz是 ...

  6. 逆向与BOF基础——注入shellcode并执行&Return-to-libc

    逆向与BOF基础--注入shellcode并执行 准备阶段 下载安装execstack. 本次实验实验的shellcode是心远的文章中生成的代码,即\x31\xc0\x50\x68\x2f\x2f\ ...

  7. Java 进阶7 并行优化 JDK多任务执行框架技术

    Java 进阶7 并行优化 JDK多任务执行框架技术 20131114          Java 语言本身就是支持多线程机制的,他提供了 Thread 类 Runnable 接口等简单的多线程支持工 ...

  8. 千锋教育Vue组件--vue基础的方法

    课程地址: https://ke.qq.com/course/251029#term_id=100295989 <!DOCTYPE html> <html> <head& ...

  9. SaltStack介绍——SaltStack是一种新的基础设施管理方法开发软件,简单易部署,可伸缩的足以管理成千上万的服务器,和足够快的速度控制,与他们交流

    SaltStack介绍和架构解析 简介 SaltStack是一种新的基础设施管理方法开发软件,简单易部署,可伸缩的足以管理成千上万的服务器,和足够快的速度控制,与他们交流,以毫秒为单位.SaltSta ...

随机推荐

  1. Java中多线程的使用(超级超级详细)线程池 7

    Java中多线程的使用(超级超级详细)线程池 7 什么是线程池? 线程池是一个容纳多个线程的容器,线程池中的线程可以重复使用,无需反复创建线程而消耗过多的资源 *使用多线程的好处: 1.降低消耗,减少 ...

  2. EF中延迟加载的那些事

    延迟加载又称懒加载,通俗一点就是关联了一个对象,不用的时候不去查这个对象,当调用的时候再组织sql去查出这个对象的相关内容. 一.在使用EF时,我们会发现借助于框架生成的实体类中的的导航属性通常是标记 ...

  3. Python 脚本语言

    python 脚本语言(python的命名起源于一个脚本screenplay,每次运行都会使对话框逐字重复.由著名的“龟叔”Guido van Rossum在1989年圣诞节期间编写.) Python ...

  4. 题解 CF938G 【Shortest Path Queries】

    题目让我们维护一个连通无向图,边有边权,支持加边删边和询问从\(x\)到\(y\)的异或最短路. 考虑到有删边这样的撤销操作,那么用线段树分治来实现,用线段树来维护询问的时间轴. 将每一条边的出现时间 ...

  5. Java基础之(IO流)

    简介: 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作. 一.File ...

  6. 郭神的关于git软件和http的文章

    https://blog.csdn.net/guolin_blog/article/details/17482095

  7. Bug--slfj4依赖冲突

    SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/F:/Spring%20p ...

  8. Python time localtime()方法

    描述 Python time localtime() 函数类似gmtime(),作用是格式化时间戳为本地的时间.高佣联盟 www.cgewang.com 如果sec参数未输入,则以当前时间为转换标准. ...

  9. PHP log10() 函数

    实例 返回不同数的以 10 为底的对数: <?phpecho(log10(2.7183) . "<br>");echo(log10(2) . "< ...

  10. PHP is_infinite() 函数

    ------------恢复内容开始------------ 实例 判断一个值是否为无限值: <?php echo is_infinite(2) . "<br>" ...