基于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 ...
随机推荐
- 2022-3-17内部群每日三题-清辉PMP
1.一个项目预算为6000万美元,预计需要24个月才能完成.12个月后,该项目完成了60%,并使用了3500美元.那么预算和进度的状态如何? A.符合预算,并超前于进度 B.超出预算,但超前于进度 C ...
- 第六章 mysql日志
第六章 mysql日志 一 错误日志 错误日志的默认存放路径是 mysql 存放数据的地方 hostname.err 1. 修改错误日志存放路径 [mysqld] log-error=/data/m ...
- jemeter批量测试
一.使用badboy录制脚本 1.下载安装badboy(参看:https://blog.csdn.net/qq_36396763/article/details/78803381),成功标志如下: 2 ...
- 源码安装pg9.6
源码安装pg9.6 添加用户 useradd pg96 下载源码包 wget https://ftp.postgresql.org/pub/source/v9.6.24/postgresql-9.6. ...
- Count Triplets That Can Form Two Arrays of Equal XOR
Count Triplets That Can Form Two Arrays of Equal XOR 题意 给定一个数组,求多少个三元对\((i,j,k)\)满足\(S(i,j-1)=S(j,k) ...
- Leetcode本地阅读器开发--01界面设计一
返回项目声明及目录:Leetcode本地阅读器开发--总声明 整个界面设计如下:后续可能会不断优化和加入新功能 1.启动后界面 2.进行具体题目搜索 3.进行分类搜索 本节主要介绍程序界面的绘制: 1 ...
- 基础vue的一些知识补充
一.:disabled 该属性能接受布尔值,可以用于元素的使用.当值为true时,该元素将无法被使用,如button的disabled属性被设置为true后,将无法被点击,input的disabled ...
- Read And Write
The process of argument(论据的过程) Making a claim.(申明观点) Pointing out the opposing idea.(指出相反观点) Support ...
- AIGC 至少能在两个方面改变当前的世界-纯银
互联网圈一个正在形成的共识是,web3 只是金融领域的创新,还没有任何征兆能进入大众社会,但 AIGC 对世界的改变正在眼前发生.AIGC 至少能在两个方面改变当前的世界.1.对于缺乏创造力的(文字) ...
- 在开启hadoop时候报错:localhost: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
此时 ssh localhost也会失败 原因是秘钥没有给自己, 运行ssh-copy-id -i ~/.ssh/id_rsa.pub root@localhost 即可解决.