前一篇随笔讲了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. [jvm] -- 判断对象是否死亡篇

    判断对象是否死亡的两种方法 引用计数法 给对象中添加一个引用计数器,每当有一个地方引用它,计数器就加 1:当引用失效,计数器就减 1:任何时候计数器为 0 的对象就是不可能再被使用的. 优点: 简单 ...

  2. WBF交易所如何使用二次验证码/谷歌身份验证器

    一般点账户名——设置——安全设置中开通虚拟MFA两步验证 具体步骤见链接  WBF交易所如何使用二次验证码/谷歌身份验证器 二次验证码小程序于谷歌身份验证器APP的优势 1.无需下载app 2.验证码 ...

  3. Flutter-Tips

    1.报错:flutter: Another exception was thrown: Could not find a generator for route RouteSettings原因是一个工 ...

  4. 统计M

    链接:https://vjudge.net/problem/UVA-1586 题意:给出一分子化学式,包含C,N,O,H四种元素,求M 题解:这是字符串题.分为几种情况:第一种是一个原子:第二种是多原 ...

  5. 笨办法学Python 3|百度网盘免费下载|新手基础入门书籍

    点击下方即可百度网盘免费提取 百度网盘免费下载:笨办法学Python 3 提取码:to27 内容简介: 本书是一本Python入门书,适合对计算机了解不多,没有学过编程,但对编程感兴趣的读者学习使用. ...

  6. Eclipse创建Web项目后新建Servlet时报红叉错误 or 导入别人Web项目时报红叉错误 的解决办法

    如图,出现类似红叉错误. 1.在项目名称上点击右键->Build Path->Configure Build Path 2.在弹出来的框中点击Add Library,如图 3.接下来选择U ...

  7. integrator.java目录

    integrater 目录d:\zixing\zxing-zxing-3.3.2\android-integration\src\main\java\com\google\zxing\integrat ...

  8. form表单两种提交方式的不同

      我们在使用<Form>表单的时候,最常用的提交方式就是Get和Post.我们都知道这两种方式最大的差别就是安全性,除此之外,它们还有哪些其他的区别,你知道吗?   在<Form& ...

  9. nginx--做为负载均衡使用

    在之前的文章中,我们通过服务代理的方式已经看到了Nginx有作为负载均衡服务的功能了,在这篇文章中,我会讲解Nginx的基本的负载均衡的使用.backup状态演示.轮询策略和加权轮询.负载均衡策略ip ...

  10. 大数据(hadoop)

    大数据 一.概述 二.大数据特点 三.大数据部门组织结构 hadoop框架 一.hadoop是什么 Hadoop是一个由Apache基金会所开发的分布式系统基础架构. 主要解决,海量数据的存储和海量数 ...