回到目录

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

热插拔,服务发现?

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

公开的事件

  1.        var watcher = new FileSystemWatcher();
  2. watcher.Path = AppDomain.CurrentDomain.BaseDirectory;
  3. watcher.NotifyFilter = NotifyFilters.Attributes |
  4. NotifyFilters.CreationTime |
  5. NotifyFilters.DirectoryName |
  6. NotifyFilters.FileName |
  7. NotifyFilters.LastAccess |
  8. NotifyFilters.LastWrite |
  9. NotifyFilters.Security |
  10. NotifyFilters.Size;
  11. watcher.Filter = "*.dll";
  12. // quartz运行时,可以添加新job,但不能覆盖,删除等
  13. watcher.Created += new FileSystemEventHandler((o, e) =>
  14. {
  15. foreach (var module in Assembly.LoadFile(e.FullPath).GetModules())
  16. {
  17. foreach (var type in module.GetTypes().Where(i => i.BaseType == typeof(JobBase)))
  18. {
  19. JoinToQuartz(type);
  20. }
  21. }
  22. });
  23.  
  24. //Start monitoring.
  25. watcher.EnableRaisingEvents = true;

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

  1.     Action<Type> JoinToQuartz = (type) =>
  2. {
  3. var obj = Activator.CreateInstance(type);
  4. string cron = type.GetProperty("Cron").GetValue(obj).ToString();
  5. var jobDetail = JobBuilder.Create(type)
  6. .WithIdentity(type.Name)
  7. .Build();
  8.  
  9. var jobTrigger = TriggerBuilder.Create()
  10. .WithIdentity(type.Name + "Trigger")
  11. .StartNow()
  12. .WithCronSchedule(cron)
  13. .Build();
  14.  
  15. StdSchedulerFactory.GetDefaultScheduler().Result.ScheduleJob(jobDetail, jobTrigger);
  16. Console.ForegroundColor = ConsoleColor.Yellow;
  17. Console.WriteLine($"新添加了一个服务{nameof(type)},通过心跳Job自动被加载!");
  18. };

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

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

  1.   [DisallowConcurrentExecution()]
  2. public abstract class JobBase : IJob
  3. {
  4.  
  5. #region IJob 成员
  6.  
  7. public Task Execute(IJobExecutionContext context)
  8. {
  9. try
  10. {
  11. Console.ForegroundColor = ConsoleColor.Red;
  12. Console.WriteLine(DateTime.Now.ToString() + "{0}这个Job开始执行", context.JobDetail.Key.Name);
  13. ExcuteJob(context);
  14. return Task.CompletedTask; ;
  15. }
  16. catch (Exception ex)
  17. {
  18. LoggerFactory.CreateLog().Logger_Debug(this.GetType().Name + "error:" + ex.Message);
  19. throw;
  20. }
  21. }
  22.  
  23. #endregion
  24. /// <summary>
  25. /// 执行计划,子类可以重写
  26. /// </summary>
  27. public virtual string Cron => "0/5 * * * * ?";
  28. /// <summary>
  29. /// Job具体类去实现自己的逻辑
  30. /// </summary>
  31. protected abstract void ExcuteJob(IJobExecutionContext context);
  32.  
  33. }

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

  1.   /// <summary>
  2. /// 发送消息
  3. /// </summary>
  4. public class SendEmailJob : JobBase
  5. {
  6. public override string Cron => "0/2 * * * * ?";
  7.  
  8. protected override void ExcuteJob(IJobExecutionContext context)
  9. {
  10. Console.WriteLine("发送Email");
  11. LoggerFactory.CreateLog().Logger_Debug("发送Email:" + DateTime.Now);
  12. }
  13. }

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

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

感谢各位的阅读!

回到目录

DotNetCore跨平台~Quartz热部署的福音~监控文件夹的变化的更多相关文章

  1. 使用TheFolderSpy监控文件夹的变化-邮件通知

    一.概述 当我们的文档或者代码文件发布在公网.共享文件夹中,其他用户具备访问或修改的权限时,就存在文档被覆盖或删除的分享.另外一个典型的场景,发布在Web服务器上的网页文件,在网站版本不更新的时间,服 ...

  2. DotNetCore跨平台~Quartz定时单次任务

    之前写过一篇文件<DotNetCore跨平台~Quartz热部署的福音-监控文件夹的变化>,今天主要把框架优化了一下,支持外部触发,并支持外部将参数以JobDataMap形式进行输入,然后 ...

  3. [转帖]DotNetCore跨平台~System.DrawingCore部署Linux需要注意的

    DotNetCore跨平台~System.DrawingCore部署Linux需要注意的   https://www.bbsmax.com/A/QV5ZemYVJy/?tdsourcetag=s_pc ...

  4. Webpack 热部署检测不到文件的变化

    最近在用webpack开发,突然发现热部署检测不到文件的变化,相关webpack的代码并没有发生改变,而且同事们的webpack都是正常的,不能热部署严重影响我的开发效率. 网上查了一下原来 Webp ...

  5. Webpack 热部署检测不到文件变化问题

    Webpack 热部署检测不到文件变化问题 今天在用Webpack开发的时候,突然发现文件变动后热部署功能不工作了,感觉好像是webpack检测不到文件的修改了.折腾了半天,开始一直以为是自己的代码有 ...

  6. Python 的 pyinotify 模块 监控文件夹和文件的变动

    官方参考: https://github.com/seb-m/pyinotify/wiki/Events-types https://github.com/seb-m/pyinotify/wiki/I ...

  7. Storm监控文件夹变化 统计文件单词数量

    监控指定文件夹,读取文件(新文件动态读取)里的内容,统计单词的数量. FileSpout.java,监控文件夹,读取新文件内容 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...

  8. 【.Net 学习系列】-- FileSystemWatcher 监控文件夹新生成文件,并在确认文件没有被其他程序占用后将其移动到指定文件夹

    监控文件夹测试程序: using System; using System.Collections.Generic; using System.IO; using System.Linq; using ...

  9. SVN配置以及自己主动部署到apache虚拟文件夹

    SVN配置以及自己主动部署到apache虚拟文件夹 一.VisualSVN server 服务端和TortoiseSVNclient下载 VisualSVN下载:http://subversion.a ...

随机推荐

  1. redhat nginx随机启动脚本

    开机自动启动nginx 1.    扔脚本进去/etc/init.d/ 2.    授权     chmod +x nginx 3.    一旦抛出:binsh^M错误就执行编码改写     设置do ...

  2. Android不编译某个模块

    Android 5.1 源码,编译相关的文件一般在build目录下build/target/product 放了很多mk文件:一般不同的产品会有不同的目录 假设我不想编译OpenWnn,在build目 ...

  3. 读Zepto源码之Callbacks模块

    Callbacks 模块并不是必备的模块,其作用是管理回调函数,为 Defferred 模块提供支持,Defferred 模块又为 Ajax 模块的 promise 风格提供支持,接下来很快就会分析到 ...

  4. 学习笔记TF027:卷积神经网络

    卷积神经网络(Convolutional Neural Network,CNN),可以解决图像识别.时间序列信息问题.深度学习之前,借助SIFT.HoG等算法提取特征,集合SVM等机器学习算法识别图像 ...

  5. jenkins - ssh Server Groups Center

  6. .Net 调用微信公众号扫一扫

    1.绑定域名 去微信公众号平台中设置js接口安全域名,要注意的是不填写http://, 只填写域名即可,如 www.baidu.com. 一个月只能修改三次,要谨慎填写. 2.引入JS文件 在页面中引 ...

  7. iOS图解多线程

    前言 多线程一直是iOS开发中重中之重的话题,无论是面试还是真正在公司中进行业务开发,都会经常使用到多线程来开发.笔者在简书上看到一张图,记录的是多线程的相关知识,笔者认为这是非常好的,推荐给大家: ...

  8. 什么是B-Tree

    B-Tree就是我们常说的B树,一定不要读成B减树,否则就很丢人了.B树这种数据结构常常用于实现数据库索引,因为它的查找效率比较高. B-Tree与二叉查找树的对比 我们知道二叉查找树查询的时间复杂度 ...

  9. JSP制作简单登陆

    JSP制作简单登陆界面 运行环境 eclipse+tomcat+MySQL 不知道的可以参考Jsp运行环境--Tomcat 项目列表 这里我先把jsp文件先放在Web-INF外面访问 需要建立的几个文 ...

  10. 【附答案】Java 大数据方向面试题,你会几个?

    1.Collection 和 Collections的区别.   Collections是个java.util下的类,它包含有各种有关集合操作的静态方法.   Collection是个java.uti ...