基于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 ...
随机推荐
- Java-JSP页面实现简单登录退出(菜鸟一枚、仅供参考)
1.JSP页面代码 <%@ page language="java" contentType="text/html; charset=UTF-8" pag ...
- 【Nday】Spring-Cloud-SpEL-表达式注入漏洞复现
# 环境搭建 JDK 15下载: https://www.oracle.com/java/technologies/javase/jdk15-archive-downloads.html 在Cen ...
- 数据库负载均衡 happroxy 中间器(Nginx)容器的安装与配置
docker 镜像中安装haproxy 1.下载并安装haproxy镜像 docker pull happroxy # docker pull haproxy:1.7 2.查看镜像 docker i ...
- 解决vue 移动端项目“切换页面,页面置顶”后报错为:"TypeError: Cannot set property 'scrollTop' of null"
参考原代码链接:https://www.cnblogs.com/wayneliu007/p/11932204.html 报错截图: 解决方法: 导入的getScrollParent为真返回的null ...
- GraalVM & Spring Boot初体验
前言 这两天封在家里,一直在琢磨想去把这个博客项目改成微服务的形式.不过就目前而言我的服务器内存放好几个Java进程是吃不消的,原因在于一个独立的JVM所占用的内存资源太吃内存.不过在云原生时代,使用 ...
- iframe 嵌套别的系统不显示,父窗口不响应
显示不全,没有登录界面,检查了代码渲染了,只是display:none :换了网址 ,别的都可以,只有这个不行 搜索 复制
- Liunx安装Docker
1.更新yum包到最新 sudo yum update 2.卸载历史Docker,如果没有安装过,则跳过该步 sudo yum remove docker \ docker-client \ dock ...
- kubernetes系列—Ubuntu下搭建Kubernetes集群--k8s部署
1.kubernetes安装介绍 1.1 K8S架构图 1.2 K8S搭建安装示意图 2.安装kubernetes 2.1 关闭防火墙 在每台机器上关闭防火墙: ① 关闭服务,并设为开机不自启 $ ...
- AntD为Form的List设置默认值 (antd form.list 设置默认值 )
import React from "react"; function demo() { const FormConfig = { labelCol: { span: 8 }, w ...
- 微信点击链接:debugx5.qq.com提示您使用的不是x5内核
微信点击链接:debugx5.qq.com提示您使用的不是x5内核 因为要测试小程序,需要webview调试功能,正常来说在微信任意一个聊天窗口,输入:debugx5.qq.com,点击该链接就可以, ...