DotNetCore跨平台~Quartz热部署的福音~监控文件夹的变化

简介:

在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<Type> 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
        /// <summary>
        /// 执行计划,子类可以重写
        /// </summary>
        public virtual string Cron => "0/5 * * * * ?";
        /// <summary>
        /// Job具体类去实现自己的逻辑
        /// </summary>
        protected abstract void ExcuteJob(IJobExecutionContext context);

    }

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

   /// <summary>
    /// 发送消息
    /// </summary>
    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一下吧!哈哈!

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

感谢各位的阅读!

本文转自博客园张占岭(仓储大叔)的博客,原文链接:DotNetCore跨平台~Quartz热部署的福音~监控文件夹的变化,如需转载请自行联系原博主。

目录
相关文章
|
28天前
|
Java Shell 测试技术
环境切换大法:掌握Spring Boot多套配置与@Profile注解的高级技巧
环境切换大法:掌握Spring Boot多套配置与@Profile注解的高级技巧
40 2
环境切换大法:掌握Spring Boot多套配置与@Profile注解的高级技巧
|
2月前
|
缓存 移动开发 监控
Star 1.3K!推荐一款可以远程调试任意Web项目的开源工具!
Star 1.3K!推荐一款可以远程调试任意Web项目的开源工具!
|
11月前
|
JavaScript 安全 Android开发
Android应用之Hybird混合开发,集成web页面的方法尝试
Android应用之Hybird混合开发,集成web页面的方法尝试
|
12月前
|
XML 开发框架 JSON
03.【.netcore Configuration】新一代的配置系统Configuration在支持多数据源,热更新,层级化方面代码快速实践
03.【.netcore Configuration】新一代的配置系统Configuration在支持多数据源,热更新,层级化方面代码快速实践
93 0
|
XML 自然语言处理 Java
【Java框架型项目从入门到装逼】第三节 - 如何用Tomcat发布web项目?
【Java框架型项目从入门到装逼】第三节 - 如何用Tomcat发布web项目?
实战:第二十六章:Idea启动项目报错解决方案
实战:第二十六章:Idea启动项目报错解决方案
186 0
|
SQL 监控 Linux
Goploy Web部署系统工具开源项目搭建教程
之前小组一直使用开源项目Spug自动构建发布项目,可是Spug目前只支持GIt不支持Svn然后又找啊找突然发现了这个一款开源的项目Goploy,学习了一下简直不要太优秀,部署项目的时候遇到一点小问题,网上找了找好像没有关于Goploy的教程,所以在这里记录一下,供大家参考.
Goploy Web部署系统工具开源项目搭建教程
|
搜索推荐 IDE Java
pinpoint插件开发之二:从零开始新建一个插件
从零开始新建pinpoint插件,本篇给出从编码到部署运行的详细步骤
874 0
pinpoint插件开发之二:从零开始新建一个插件
|
Rust 资源调度 JavaScript
桌面端开发(Tauri)开启第一篇
桌面端开发(Tauri)开启第一篇
1140 0
桌面端开发(Tauri)开启第一篇
|
IDE 前端开发 Java
微服务开发神器之JRebel 插件破解和实现本地及远程热部署教程
微服务开发神器之JRebel 插件破解和实现本地及远程热部署教程
1208 0
微服务开发神器之JRebel 插件破解和实现本地及远程热部署教程