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热部署的福音~监控文件夹的变化的更多相关文章
- 使用TheFolderSpy监控文件夹的变化-邮件通知
一.概述 当我们的文档或者代码文件发布在公网.共享文件夹中,其他用户具备访问或修改的权限时,就存在文档被覆盖或删除的分享.另外一个典型的场景,发布在Web服务器上的网页文件,在网站版本不更新的时间,服 ...
- DotNetCore跨平台~Quartz定时单次任务
之前写过一篇文件<DotNetCore跨平台~Quartz热部署的福音-监控文件夹的变化>,今天主要把框架优化了一下,支持外部触发,并支持外部将参数以JobDataMap形式进行输入,然后 ...
- [转帖]DotNetCore跨平台~System.DrawingCore部署Linux需要注意的
DotNetCore跨平台~System.DrawingCore部署Linux需要注意的 https://www.bbsmax.com/A/QV5ZemYVJy/?tdsourcetag=s_pc ...
- Webpack 热部署检测不到文件的变化
最近在用webpack开发,突然发现热部署检测不到文件的变化,相关webpack的代码并没有发生改变,而且同事们的webpack都是正常的,不能热部署严重影响我的开发效率. 网上查了一下原来 Webp ...
- Webpack 热部署检测不到文件变化问题
Webpack 热部署检测不到文件变化问题 今天在用Webpack开发的时候,突然发现文件变动后热部署功能不工作了,感觉好像是webpack检测不到文件的修改了.折腾了半天,开始一直以为是自己的代码有 ...
- Python 的 pyinotify 模块 监控文件夹和文件的变动
官方参考: https://github.com/seb-m/pyinotify/wiki/Events-types https://github.com/seb-m/pyinotify/wiki/I ...
- Storm监控文件夹变化 统计文件单词数量
监控指定文件夹,读取文件(新文件动态读取)里的内容,统计单词的数量. FileSpout.java,监控文件夹,读取新文件内容 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...
- 【.Net 学习系列】-- FileSystemWatcher 监控文件夹新生成文件,并在确认文件没有被其他程序占用后将其移动到指定文件夹
监控文件夹测试程序: using System; using System.Collections.Generic; using System.IO; using System.Linq; using ...
- SVN配置以及自己主动部署到apache虚拟文件夹
SVN配置以及自己主动部署到apache虚拟文件夹 一.VisualSVN server 服务端和TortoiseSVNclient下载 VisualSVN下载:http://subversion.a ...
随机推荐
- 使用Linux环境变量
bash shell用一个叫做环境变量的特性来存储有关shell会话和工作环境的信息. 全局环境变量 这对shell 会话和所有生成的子shell都是可见的.局部变量只对创建他们的shell可见. 系 ...
- 【.net 深呼吸】自己动手来写应用程序设置类
在开始装逼之前,老周先说明一件事.有人说老周写的东西太简单了,能不能写点复杂点.这问题就来了,要写什么东西才叫“复杂”?最重要的是,写得太复杂了,一方面很多朋友看不懂,另一方面,连老周自己也不知道怎么 ...
- 登录界面Demo
今天记载一个Demo,这个是我练习项目中用到,供新手看看,界面图:
- ARM开发(2)基于STM32的蜂鸣器
基于STM32的蜂鸣器 一 蜂鸣器原理: 1.1 本实验实现1个蜂鸣器间隔1S鸣叫. 1.2 实验思路:根据电路图原理,给蜂鸣器相关引脚赋予高低电平,实现电路的导通,使蜂鸣器实现鸣叫或不鸣. 1 ...
- Objective-C 使用核心动画CAAnimation实现动画
先来看看效果吧 整个核心动画就不多做介绍了,随便一搜就能有很多很详细的解释,主要使用以下四种 CABasicAnimation //经典动画 CAKeyframeAnimation //关键帧动画 C ...
- POI读取excel工具类 返回实体bean集合(xls,xlsx通用)
本文举个简单的实例 读取上图的 excel文件到 List<User>集合 首先 导入POi 相关 jar包 在pom.xml 加入 <!-- poi --> <depe ...
- 关于html转换为pdf案例的一些测试与思考
由于工作所需,最近花时间研究了html转换为pdf的功能.html转换为pdf的关键技术是如何处理网页中复杂的css样式,通过在网上收集资料,发现目前html 转换为pdf的解决方案主要分为三类: 客 ...
- 创建 overlay 网络 - 每天5分钟玩转 Docker 容器技术(50)
上一节我们搭建好实验环境,配置并运行了consul,今天开始创建 overlay 网络. 在 host1 中创建 overlay 网络 ov_net1: -d overlay 指定 driver 为 ...
- pick定理详解
一.概念 假设P的内部有I(P)个格点,边界上有B(P)个格点,则P的面积A(P)为:A(P)=I(P)+B(P)/2-1. 二.说明 Pick定理主要是计算格点多边形(定点全是格点的不自交图形)P的 ...
- 一篇关于Python装饰器的博文
这是一篇关于python装饰器的博文 在学习python的过程中处处受阻,之前的学习中Python的装饰器学习了好几遍也没能真正的弄懂.这一次抓住视频猛啃了一波,就连python大佬讲解装饰器起来也需 ...