• 基于Quartz.Net通过反射进行任务调度


    通过反射加载任务调度

    需求:

    1. 因为有些任务需要进行各种定时操作,因此将 Quartz.Net 简单封装了一下使用;
    2. 希望通过上传 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();
                }
            }
        }
    }
    
    
  • 相关阅读:
    python学习笔记----正则表达式
    MongoDB系统CentOS 7.1 crash的排障过程
    MySQL实例crash的案例分析
    关于MySQL连接抛出Authentication Failed错误分析
    Redis偶发连接失败案例分析
    MYSQL NULL值特性
    一个MySQL 5.7 分区表性能下降的案例分析
    Linux 桥接网络不自动分配IP的问题
    Docker浅析
    配置Servlet 容器
  • 原文地址:https://www.cnblogs.com/fires/p/16438461.html
Copyright © 2020-2023  润新知