博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DotNetCore跨平台~Quartz热部署的福音~监控文件夹的变化
阅读量:6883 次
发布时间:2019-06-27

本文共 4202 字,大约阅读时间需要 14 分钟。

在DotNetCore出来之后,同时也使用了quartz进行调度中心的设计,将它做到docker里方便部署,在之前的quartz版本里支持配置文件的方式,而现在不支持了,我们应该去想一下,为什么不去支持配置文件?当然大叔也为配置文件设计了支持的方式,但我们还是应该想想作者为什么不去支持配置?

热插拔,服务发现?

和上面两个概念可能有点关系,热插拔很容易理解,就是把dll模块放到正在运行的项目时,它可以直接启动,这个功能对调度中心来说,很是必要,因为你可能需要按着不同的功能设计一些服务job,而这些服务没有什么联系,每个job功能单一,如果做成热部署,挺好!而服务发现在最近<微服务>里很是枪眼,今天说的服务发现并不是它,而是dotnet core公开的对文件夹的监控,其实就是一种事件机制,当windows底层文件夹改变时(增,删,改文件),会向上触发对应的事件,而我们只要去订阅它即可,非常的松耦合!

公开的事件

       var watcher = new FileSystemWatcher();            watcher.Path = AppDomain.CurrentDomain.BaseDirectory;            watcher.NotifyFilter = NotifyFilters.Attributes |                                   NotifyFilters.CreationTime |                                   NotifyFilters.DirectoryName |                                   NotifyFilters.FileName |                                   NotifyFilters.LastAccess |                                   NotifyFilters.LastWrite |                                   NotifyFilters.Security |                                   NotifyFilters.Size;            watcher.Filter = "*.dll";            // quartz运行时,可以添加新job,但不能覆盖,删除等            watcher.Created += new FileSystemEventHandler((o, e) =>            {                foreach (var module in Assembly.LoadFile(e.FullPath).GetModules())                {                    foreach (var type in module.GetTypes().Where(i => i.BaseType == typeof(JobBase)))                    {                        JoinToQuartz(type);                    }                }            });            //Start monitoring.            watcher.EnableRaisingEvents = true;

将job添加到Quartz需要在初始化和文件夹监控两个地方用到,所以我们进行了抽象,把它提到一个委托里,使用.net4.0的Actioin<T>委托来实现最为合适了!

    Action
JoinToQuartz = (type) => { var obj = Activator.CreateInstance(type); string cron = type.GetProperty("Cron").GetValue(obj).ToString(); var jobDetail = JobBuilder.Create(type) .WithIdentity(type.Name) .Build(); var jobTrigger = TriggerBuilder.Create() .WithIdentity(type.Name + "Trigger") .StartNow() .WithCronSchedule(cron) .Build(); StdSchedulerFactory.GetDefaultScheduler().Result.ScheduleJob(jobDetail, jobTrigger); Console.ForegroundColor = ConsoleColor.Yellow; Console.WriteLine($"新添加了一个服务{nameof(type)},通过心跳Job自动被加载!"); };

大叔把它应用到了调度中心上,具体就是当调试项目里有新的模块DLL出现后,自动将它添加到quartz的列表里,然后当然它有自己的cron表达式去控制自己的调度周期,你是定点地还是周期运行完成由自己的job去控制,如果有新功能,就加新Job,是否有点单一职责和开闭原则的意思!

JobBase,所有模块的功能Job都要继承它,可以根据自己的情况,实现cron和业务ExcuteJob方法!

  [DisallowConcurrentExecution()]    public abstract class JobBase : IJob    {        #region IJob 成员        public Task Execute(IJobExecutionContext context)        {            try            {                Console.ForegroundColor = ConsoleColor.Red;                Console.WriteLine(DateTime.Now.ToString() + "{0}这个Job开始执行", context.JobDetail.Key.Name);                ExcuteJob(context);                return Task.CompletedTask; ;            }            catch (Exception ex)            {                LoggerFactory.CreateLog().Logger_Debug(this.GetType().Name + "error:" + ex.Message);                throw;            }        }        #endregion        ///         /// 执行计划,子类可以重写        ///         public virtual string Cron => "0/5 * * * * ?";        ///         /// Job具体类去实现自己的逻辑        ///         protected abstract void ExcuteJob(IJobExecutionContext context);    }

下面看其中一个业务Job的实现,它主要由调度计划cron和业务执行方法ExcuteJob组成

  ///     /// 发送消息    ///     public class SendEmailJob : JobBase    {        public override string Cron => "0/2 * * * * ?";        protected override void ExcuteJob(IJobExecutionContext context)        {            Console.WriteLine("发送Email");            LoggerFactory.CreateLog().Logger_Debug("发送Email:" + DateTime.Now);        }    }

当我们把这个项目发布到dotnet core之后,可以设计一个web api /web mvc管理UI,然后去查看和管理自己的任务,现在quartz2.x里的crystal管理工具已经用不了了,所以咱们还是DIY一下吧!哈哈!

可以查看任务列表,管理它们的启动与停止的状态!

感谢各位的阅读!

转载地址:http://udnbl.baihongyu.com/

你可能感兴趣的文章
cocos-lua
查看>>
jdk的安装与配置
查看>>
Python数据抓取技术与实战 pdf
查看>>
20145209 《信息安全系统设计基础》第3周学习总结
查看>>
python 进程
查看>>
Grunt插件uglify
查看>>
export 与 export default
查看>>
linux配置网卡
查看>>
正则表达式语法
查看>>
013、Dockerfile构建镜像(2019-01-02 周三)
查看>>
Office Word 2013发布带数学公式的博客
查看>>
c# mvc如何获取xml文件
查看>>
mongodb Java(八)
查看>>
JavaScript随机数
查看>>
ASP.NET验证控件——RequiredFieldValidator
查看>>
strstr
查看>>
MySQL 条件 select case 的实现(解决 零 做分母的问题 )
查看>>
openNebula rgister img instance vms error collections
查看>>
error Infos
查看>>
PL/sql配置相关
查看>>