基于Quartz.Net通过反射进行任务调度
通过反射加载任务调度
需求:
- 因为有些任务需要进行各种定时操作,因此将 Quartz.Net 简单封装了一下使用;
- 希望通过上传 dll 来进行每个任务的调度,所以写了个反射调度示例;
Program.cs
using Serilog;
using Serilog.Core;
using Quartz;
using System.Reflection;
_net.SimpleScheduler scheduler = _net.SimpleScheduler.Create();
List<IWorkItem> workItems = GetWorkItems();
foreach (var item in workItems)
{
scheduler.AddJob(item);
}
scheduler.Start();
Console.ReadLine();
static List<IWorkItem> GetWorkItems()
{
var assembly = Assembly.GetExecutingAssembly();
List<IWorkItem> workItems = new List<IWorkItem>();
foreach (var item in assembly.ExportedTypes)
{
Type? type = item.GetInterface(nameof(IWorkItem));
if (type != null && type.Name.Equals(nameof(IWorkItem)))
{
ConstructorInfo? constructorInfo = item.GetConstructor(BindingFlags.Public | BindingFlags.Instance, Type.EmptyTypes);
var workItem = constructorInfo?.Invoke(Array.Empty<object>()) as IWorkItem;
workItems.Add(item: workItem!);
}
}
return workItems;
}
public interface IWorkItem : IJob
{
ITrigger Trigger { get; set; }
IJobDetail JobDetail { get; set; }
JobKey JobKey { get; set; }
}
public class MyWork : IWorkItem
{
public ITrigger Trigger { get; set; }
public IJobDetail JobDetail { get; set; }
public JobKey JobKey { get; set; }
private static Logger? _log = new LoggerConfiguration()
.WriteTo.Console()
.CreateLogger();
public MyWork()
{
Trigger = TriggerBuilder.Create().WithDailyTimeIntervalSchedule(d => d.WithIntervalInSeconds(3)).StartNow().WithIdentity("trigger", "test").Build();
JobDetail = JobBuilder.Create(this.GetType()).WithIdentity("jobDetail", "test").Build();
JobKey = JobDetail.Key;
}
public Task Execute(IJobExecutionContext context)
{
_log.Information("MyJob current date {A}", DateTime.Now.ToLongTimeString());
return Task.CompletedTask;
}
}
SimpleScheduler.cs
namespace _net
{
/// <summary>
/// 基于 Quartz.Net 简单的封装
/// </summary>
public class SimpleScheduler
{
private Quartz.ISchedulerFactory _schedulerFactory;
private Quartz.IScheduler _scheduler;
public SimpleScheduler()
{
_schedulerFactory = new Quartz.Impl.StdSchedulerFactory();
_scheduler = _schedulerFactory.GetScheduler().ConfigureAwait(false).GetAwaiter().GetResult();
}
public static SimpleScheduler Create()
{
return new SimpleScheduler();
}
public SimpleScheduler AddJob(IWorkItem workItem)
{
_scheduler.ScheduleJob(workItem.JobDetail, workItem.Trigger);
return this;
}
public void Start()
{
_scheduler.Start();
}
public void Shutdown()
{
if (_scheduler != null)
{
_scheduler.Shutdown();
}
}
}
}
基于Quartz.Net通过反射进行任务调度的更多相关文章
- Window服务基于Quartz.Net组件实现定时任务调度(二)
前言: 在上一章中,我们通过利用控制台实现定时任务调度,已经大致了解了如何基于Quartz.Net组件实现任务,至少包括三部分:job(作业),trigger(触发器),scheduler(调度器). ...
- 控制台基于Quartz.Net组件实现定时任务调度(一)
前言: 你曾经需要应用执行一个任务吗?比如现在有一个需求,需要每天在零点定时执行一些操作,那应该怎样操作呢? 这个时候,如果你和你的团队是用.NET编程的话,可以考虑使用Quartz.NET调度器.允 ...
- 任务调度之持久化(基于Quartz.net)
上一篇我们了解了任务调度及他的远端管理方式,传送门:任务调度及远端管理(基于Quartz.net) 这篇我们要完成任务调度的持久化功能,即新增修改删除之类的功能,这必须得要有的,不然都不知道后台都有什 ...
- 任务调度之集群(基于Quartz.net)
上一篇我们完成了任务调度的持久化,传送门:任务调度之持久化(基于Quartz.net) 这篇我们来完成Quartz.net的一个比较优秀的功能,即集群:集群可以提高任务调度服务的容灾性, 当一个节点宕 ...
- RDIFramework.NET框架基于Quartz.Net实现任务调度详解及效果展示
在上一篇Quartz.Net实现作业定时调度详解,我们通过实例代码详细讲解与演示了基于Quartz.NET开发的详细方法.本篇我们主要讲述基于RDIFramework.NET框架整合Quartz.NE ...
- 一行代码完成定时任务调度,基于Quartz的UI可视化操作组件 GZY.Quartz.MUI
前言 之前发布过第一个版本,有兴趣的可以去看看: NET Core 基于Quartz的UI可视化操作组件 GZY.Quartz.MUI 简介 GitHub开源地址:l2999019/GZY.Quart ...
- Quartz.NET总结(五)基于Quartz.net 的开源任务管理平台
前面总结了很多,关于Quartz.net 的文章,介绍了如何使用Quartz.net.不清楚的朋友,可以看我之前的系列文章,http://www.cnblogs.com/zhangweizhong/c ...
- 基于Quartz.NET构建自己的动态作业调度器
在日常的开发中,运行定时任务基本上已经是很普遍的需求了,可以通过windows服务+timer组件来实现,也可以使用第三方框架来集成,Quartz.NET就是一款从JAVA的Quartz移植过来的一个 ...
- 基于Quartz实现简单的定时发送邮件
一.什么是Quartz Quartz 是一个轻量级任务调度框架,只需要做些简单的配置就可以使用:它可以支持持久化的任务存储,即使是任务中断或服务重启后,仍可以继续运行.Quartz既可以做为独立的应用 ...
- Java 基于quartz实现定时 之二(XML方式配置)
<!-- 在spring核心配置文件中进行如下配置 --> <!-- Spring基于quartz定时任务 --> <bean id="triggerByBea ...
随机推荐
- lua中self的意义
原文链接 最近在用合宙的Air302开发物联网项目,因为合宙用的自家的luatOS操作系统,二次开发全都要用lua写,据说lua写起代码比C更方便,但是不会就是不会啊喂!!学不会就是不方便啊,例如这个 ...
- ts补充
// ts中类型主要包括 1.元组 2.接口(对象,函数,构造器)类型 3.枚举类型 4.字面量类型 5.特殊类型 // ts中类型类型运算主要包括 1.条件类型 : 2.推导类型 3.联合类型 4. ...
- HCIA-ICT实战基础09-远程接入安全管理
HCIA-ICT实战基础-远程接入安全管理 目录 AAA概述 AAA配置实现 telnet原理与配置 Stelnet(华为ssh的另一种称呼)配置 1 AAA概述 1.1 基本概念 AAA是Authe ...
- 关于webdriver和谷歌浏览器的那些事
早上看了一个视频,讲述爬虫的,首先一开始就写了一行这样代码(如下): from selenium import webdriver # 创建浏览器对象 ,这会在电脑中打开浏览器窗口browser = ...
- MFC学习记录2
一.建立基于对话框工程,改变UI对象 1.改变菜单.工具栏 在资源栏中编辑菜单.工具栏,注意ID 编辑ID [Pen/Thick Line] ID : ID_PEN_THICK_OR_THIN pro ...
- Jmeter添加while控制器
通过添加while控制器,可以实现条件+循环判断,使while控制器内的子线程根据之前线程的返回(while控制器内外变量皆可)进行触发+循环的控制. 原理如下:通过Condition判断条件语句是否 ...
- iOS包大小计算
一.LinkMap文件分析 说明:LinkMap数据是根据文章<LinkMap文件分析>中方法实验实测数据. 如何获得LinkMap文件 1.在XCode中开启编译选项Write Link ...
- python+pytesseract识别图片文字
此文只介绍一下python+pytesseract识别一些简单图片的数字,字母和汉字.如图1 import pytesseract from PIL import Image,ImageEnhance ...
- 使用Python实现给企业微信发送allure报告,并实现微信查看
1.注册企业微信 搜索企业微信直接注册 2.创建应用 3.查看企业id.Secret.应用id.部门id 4.发送代码 import os import jenkins import requests ...
- Leetcode457
A very absurd description for this problem, but people can get the idea by looking at the examples.. ...