FluentScheduler介绍

github地址:https://github.com/fluentscheduler/FluentScheduler

FluentScheduler是一个简单的任务调度框架,使用起来非常方便,这个框架也是我在搜索iis预加载的时候偶然间发现的,立马拿来试用一下,感觉爽呆了,当然还有Quarz.Net之类的其他任务管理框架,不过看配置似乎有点麻烦,反正除了timer我啥也没用过...

之前还花费了很长一段时间自己写了一套定时任务的框架,如今看到FluentScheduler我已经决定将之前的废弃了...

好吧,废话不多说,框架调用非常简单,所以直接上代码了,其实我做的只不过是把英文翻译一下

FluentScheduler使用

.net 框架:.net framework 4.5

项目:.net mvc5

如果要在winform,wpf之类的项目中使用是完全没有问题的,因为本文最终的目标是实现将该web项目作为一个定时任务的服务,所以选择了以上的架构

1.引用nuget包:FluentScheduler

2.Application_Start函数加上:

//初始化任务管理器
JobManager.Initialize(new MyRegistry());

3.MyRegistry.cs

public class MyRegistry : Registry
{public MyRegistry(){// Schedule an IJob to run at an interval// 立即执行每10秒一次的计划任务。(指定一个时间间隔运行,根据自己需求,可以是秒、分、时、天、月、年等。)Schedule<MyJob>().ToRunNow().AndEvery(10).Seconds();// 立即执行每10秒一次的计划任务。如果本次任务没有结束,下一次的任务则不会开始,禁止并行运行Schedule<MyJob>().www.leyouzaixan.cn NonReentrant().ToRunNow().AndEvery(10).Seconds();//在每天的21:15执行计划任务Schedule(() => Console.WriteLine("www.taohuayuan178.com It's 9:15 PM now.")).ToRunEvery(1).Days().At(21, 15);// 立即执行一个在每月的第一个星期一 3:00 的计划任务Schedule(() => Console.WriteLine("It's 3:00 AM now.")).ToRunNow().AndEvery(1).Months().OnTheFirst(DayOfWeek.Monday).At(3, 0);//在每周一的21:15执行计划任务Schedule(() => Console.WriteLine("It's 9:15 PM now.")).ToRunEvery(1).Weeks().On(DayOfWeek.Monday).At(21, 15);}}

上面需要注意的是NonReentrant函数的使用,在某些特殊的业务里可能任务执行的时间比定时循环的间隔时间要长,这时候你就要考虑是否允许并行运行两个同样的任务,NonReentrant就是用来解决这个问题的

4.MyJob.cs

public class MyJob : IJob, IRegisteredObject
{private readonly object _lock = new object(www.qinlinyule.cn);private bool _shuttingDown;private static Logger logger = LogManager.GetCurrentClassLogger(); //初始化日志类public MyJob(){HostingEnvironment.RegisterObject(this);}public void Execute(){try{lock (_lock){if (_shuttingDown)return;logger.Info("开始工作:" + DateTime.Now);Thread.Sleep(60*1000);logger.Info("工作结束:" +www.vboyule.cn  DateTime.Now);}}finally{HostingEnvironment.UnregisterObject(this);}}public void Stop(bool immediate){logger.Info("调用stop:" + DateTime.Now);lock (_lock){logger.Info("lock结束:" + DateTime.Now);_shuttingDown = true;}HostingEnvironment.UnregisterObject(this);}
}

上面是一个简单的示例,所有的业务逻辑都在Execute函数中执行,如果不在web项目中运行,则不需要实现IRegisteredObject接口以及stop函数,所有的业务代码均在Execute函数中执行

在ASP.NET中作定时任务

在之前我们也有部分项目用widowsservice来做定时任务,但是弊端很明显,调试太麻烦,发布也麻烦,自动发布更难实现

相比之下web服务器就容易管理的多了

实际上在asp.net 中的定时任务和FluentScheduler框架并没有什么必然的联系,你也可以用timer或其他的任何方式来实现,但是所有的这些实现方式都避免不了面对一个问题:IIS的回收机制

因为有了回收机制的存在,所以在asp.net中做定时任务就会面临两个问题:

1.任务没有执行完成线程就被回收了

2.线程回收之后,只有在下一次访问网站的时候任务才会再次启动

首先我们来解决第一个问题:

对于iis的回收,我们需要做的其实并不是阻止它的回收,实际上我试过各种方式都无法完全阻挡iis的回收,不知道是否是方法没有用对。

但是我们可以保证当前的任务执行完毕再进行回收

方式就是实现IRegisteredObject接口,以上面的MyJob类为例,我们通过调用HostingEnvironment.RegisterObject方法在ASP.NET中注册它

通过调用HostingEnvironment.UnregisterObject方法释放服务

当Appdomain要被回收的时候,会调用已注册对象IRegisteredObject中的Stop方法。

    //// 摘要://     Requests a registered object to unregister.//// 参数://   immediate://     true to indicate the registered object www.feifanyule.cn/ should unregister from the hosting environment//     before returning; www.089188.cn otherwise, false.void Stop(bool immediate);

在第一次调用stop方法时,参数为false,执行完毕后,如果没有调用HostingEnvironment.UnregisterObject函数,隔30秒stop方法会再次被调用,参数为true,如果仍然没有调用HostingEnvironment.UnregisterObject函数,该服务就会被移除

不过我们使用的过程中并不会考虑第二次的调用,因为在第一次stop函数被调用的时候我们就会lock住正在执行的任务,并且一直到任务执行完成再释放lock,最后调用HostingEnvironment.UnregisterObject保证任务正常退出

对于这个流程上面的Myjob就是FluentScheduler提供的一个示例

IIS预加载

应用程序池回收之后,如果没有人访问网站,w3wp是不会启动的,那也就代表着我们的定时任务就不会启动了,所以我们需要在程序池被回收之后模拟访问一下该网站,我们可以通过写一个定时的程序每隔一秒钟访问一遍该网站来解决这个问题,但是为了解决这个问题多写一个程序并没有必要,因为微软已经提供了一个网站预加载的功能,每当应用程序池被回收,系统就会启动一个进程模拟访问一遍网站。这个功能似乎是iis7之后就有了,我下面演示的iis10的界面,其他版本的界面可能会稍微有所不同

1.修改应用程序池启动模式

2.开启对应网站预加载

3.增加配置编辑器,编写默认预加载的请求页面

至此,我们的服务就可以正常的运行啦

FluentScheduler介绍相关推荐

  1. ASP.NET MVC 使用 FluentScheduler 定时器计划任务

    MacBook Pro 只有四个 USB Type-C 接口是否错了? 一项新技术的诞生总会对已存在的事物造成冲击或影响,如果大家都害怕冲击与影响,那这个世界永远像现在不变就行了,大家都好好的,待在自 ...

  2. DaleCloud(原NFine)介绍一:开发框架源代码解决方案结构介绍

    目录 前言 开发框架解决方案结构 开发框架后台技术应用 前言 言归正传,众所周知NFine框架是NFine团队出品的一款.NET MVC框架,前端用的Bootstrap.但是由于NFine框架夭折了, ...

  3. 简单介绍互联网领域选择与营销方法

    在我看来,互联网领域的选择是"安家",而营销方法的不同则表现了"定家"的方式多种多样,只有选对了,"家"才得以"安定". ...

  4. 常用开源协议介绍以及开源软件规范列表

    1. 开源协议介绍 GPL: General Public License,开源项目最常用的许可证,衍生代码的分发需开源并且也要遵守此协议.该协议也有很多变种,不同变种要求会略微不同. MPL: MP ...

  5. python:Json模块dumps、loads、dump、load介绍

    20210831 https://www.cnblogs.com/bigtreei/p/10466518.html json dump dumps 区别 python:Json模块dumps.load ...

  6. pytorch学习笔记(九):PyTorch结构介绍

    PyTorch结构介绍 对PyTorch架构的粗浅理解,不能保证完全正确,但是希望可以从更高层次上对PyTorch上有个整体把握.水平有限,如有错误,欢迎指错,谢谢! 几个重要的类型 和数值相关的 T ...

  7. Python字节码介绍

    了解 Python 字节码是什么,Python 如何使用它来执行你的代码,以及知道它是如何帮到你的. 如果你曾经编写过 Python,或者只是使用过 Python,你或许经常会看到 Python 源代 ...

  8. Pytest - 使用介绍

    1. 概述 pytest是一个非常成熟的全功能的Python测试框架,主要特点有以下几点: 1.简单灵活,容易上手,文档丰富: 2.支持参数化,可以细粒度地控制要测试的测试用例: 3.能够支持简单的单 ...

  9. 遗传算法的简单介绍以及模式定理的简单证明

    遗传算法   遗传算法(Genetic Algorithm,GA),最早是由美国的John holland在20世纪70年代提出.算法通过模拟达尔文生物进化论的自然选择以及遗传学机理的生物进化过程来搜 ...

最新文章

  1. Qt中使用多线程的一些心得(一)——继承QThread的多线程使用方法
  2. 在《我的世界》里搭建神经网络,运行过程清晰可见,这位印度小哥开发的新玩法火了...
  3. MII 功能简介(论坛整理)
  4. Android异步处理三:Handler+Looper+MessageQueue深入详解
  5. 安卓makefile与linux,分析linux make命令与Makefile的区别
  6. Express中错误处理中间件的使用
  7. java开发架构设计_跪了!阿里技术官出品:Java架构设计之完美,看完秒进大厂。...
  8. 通过document id和content拿到SAP document的binary data
  9. ubuntu下git更改默认编辑器
  10. drcom linux怎么运行,linux下使用drcom登录认证
  11. C++运算符重载函数作为类成员函数和友元函数
  12. “编程能力差,90%输在了这点上!”骨灰级工程师:其实你们都是瞎努力!
  13. VC6兼容性及打开文件崩溃问题解决
  14. ue4文档接口类学习
  15. ivms 4200 linux_iVMS-4200E 海康威视微服务器系列NVR 集成海康硬件和软件实现灵活的一站式解决方案_...
  16. 武田呈报mobocertinib的最新结果,进一步证实EGFR外显子20插入+ mNSCLC患者的临床收益
  17. LA3713 Astronauts
  18. mybatis plus(包米豆)json存储Mysql数据库
  19. 给你一个整数数组 nums 。 如果一组数字 (i,j) 满足 nums[i] == nums[j] 且 i < j ,就可以认为这是一组 好数对 。
  20. 春运又双叒来啦!阿里出手帮你抢票

热门文章

  1. 亚麻纤维截面形态_法国亚麻纤维化学成分和纤维结构分析
  2. 失败者的思维方式,看看你有几条
  3. Protocol buffer---Protobuf3开发指南
  4. python绘制图形沙漏_前端每日实战:118# 视频演示如何用纯 CSS 创作一个沙漏 loader...
  5. php云盘资源火星时代_企业网盘系统PHP云盘源码
  6. 导弹防御系统,如何跟蜻蜓的大脑学习计算?
  7. 教师资格证拿证全程思维导图模板分享
  8. c语言编程四门成绩,C语言编程题与答案
  9. 基于MFC使用HighSpeedCharting动态显示曲线中的鼠标问题
  10. Soft:软件开发的简介(敏捷开发等6大软件开发模式)、软件测试的简介(单元测试/集成测试/系统测试/验收测试/回归测试、黑白灰功能测试、DEV等四套环境)、运维的简介之详细攻略