基于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 ...
随机推荐
- G6-Editor 编辑器入门使用教程
一.前言 G6-Editor 是 AntV 官方提供的.专注于图可视化编辑器的类库,也是市面上完成度较高的图可视化编辑器.然而令人诟病的是其文档对新手极度不友好,我一度怀疑此文档只有他们自己开发人员才 ...
- git 代码已经commit ,发现提错了分支
步骤: git reset HEAD^ //把上次提交恢复为未提交状态 git status //查看当前状态 git stash //将修改add到暂存区,暂存代码 git checkout 分支 ...
- bzoj 4407
莫比乌斯反演 还是推式子: 设$f(n)=n^{k}$ 那就是上一道题了 推的过程如下: $\sum_{i=1}^{a}\sum_{j=1}^{b}f(gcd(i,j))$ $\sum_{i=1}^{ ...
- 接口自动化(TestNG)
数据驱动概念: 用户输入输出数据来判断测试用例是否通过从而验证需求的测试. 一.接口自动化框架搭建(TestNG数据驱动) ---parameter 关键代码: <?xml version=&q ...
- postgresql--column must appear in the group by clause or be used in an aggregate function
我想得到大于男女平均年龄的人 原表: 在gauss200下执行以下语句: SELECT stname,age,gender,AVG(age) FROM att_test01 GROUP BY gend ...
- qt的其他窗口
一.qt的其他类族 2.Qlabel ui->setupUi(this); QFont font;//确立一个字体对象 font.setFamily("华文行楷");//字体 ...
- DE 算法的变体python实现
上演化计算课的时候老师讲了一种DE算法的改进算法CoDE,于是看了下CoDE的论文中的算法步骤: 算法中使用的三种交叉策略: 根据不同的交叉策略采取不同的变异策略: 超参数的三种不同组合(一一对应): ...
- c++ dll 传递string参数
用c++编写了一个dll,需要传递一个路径的变量参数,刚开始想着使用string变量,但是在实践过程中string变量会成为乱码,尽量避免使用string变量传递参数,可以使用const char* ...
- CeiT:Incorporating Convolution Designs into Visual Transformers
CeiT:Incorporating Convolution Designs into Visual Transformers 将CNN提取low-level特征,强化局部特征提取的能力,与Trans ...
- Python+Django(2)——创建应用程序
新打开一个终端窗口,切换到manage.py所在的目录 激活虚拟环境:ll_env\Scripts\activate 命令startapp appname 让Django建立创建应用程序所需的基础设施 ...