ASP.NET MVC项目使用的 FluentScheduler 后台任务定时器
开发工具与关键技术:VS MVC
撰写时间:2019/5/16
FluentScheduler 是什么?自动工作调度程序,界面流畅(Automated job scheduler with fluent interface.)是一个定时任务管理器。关于如何使用,我推荐去看作者的GitHub看源码或例子,地址:https://github.com/fluentscheduler/FluentScheduler 我也是刚好学习到这个定时任务管理器,然后我把老师介绍的例子学习了解下;要是想更详细了解的话,我更推荐你到作者的GitHub看看源码或例子会有更详细的说明。
在项目中使用FluentScheduler定时任务管理器需要在项目引用插件;如果是已有FluentScheduler定时任务管理器插件的话,先把插件拷贝到项目的bin文件夹(一般放.dll文件,属于配置文件),然后在项目的“引用”右键添加引用,找到FluentScheduler插件确定引用即可。引用成功之后可在“引用”哪里看插件名称,如下截图:
如果没有这个插件的话,可以在项目中安装FluentSchedule程序包。
打开程序包管理控制台,输入Install-Package FluentScheduler即可。步骤如下截图:
版本不一样,出现的结果可能不一样。
新建一个类,类可以直接用这个插件来名称;在类里面发布任务,即是待处理的作业工厂,在构造函数中设置好各个Job的执行计划。
新建一个私有类,这个类继承FluentScheduler插件里的Registry类;在这个类里写一个构造函数,构造函数是函数名称跟类名称(方法名称)保持一致的函数;在建一个私有类,这个类是指明要工作哪里、工作内容,这个类同样是继承FluentScheduler插件的IJob工作,类里面定义一个构造函数。
第一个类,是要执行什么工作,什么时候执行这个工作;第二个类,是执行的工作内容。
第一个类:
internal class MyRegistry : Registry
{
public MyRegistry() //构造函数:函数名跟类名保持一致的函数
{
// 立即执行计划任务,并根据指定时间间隔执行一次计划任务
//(指定一个时间间隔运行,根据自己需求,可以是秒、分、时、天、月、年等。)
//Schedule().ToRunNow().AndEvery(10).Seconds();
// 延迟一个指定时间间隔执行一次计划任务。
//(当然,这个间隔依然可以是秒、分、时、天、月、年等。)
//Schedule().ToRunOnceIn(10).Seconds();
//在一个指定时间执行计划任务 每个小时的第10分钟执行
//Schedule().ToRunEvery(1).Hours().At(10);
// 在一个指定时间执行计划任务(最常用。这里是在每天的下午 1:10 分执行)
//Schedule().ToRunEvery(1).Days().At(13, 10);
//每n年的第几天
//Schedule().ToRunEvery(1).Years().On(5);
//每n年的最后一天
//Schedule().ToRunEvery(1).Years().OnTheLastDay();
//每n月的第几天
//Schedule().ToRunEvery(1).Months().On(1);
//每n月的第一个星期的星期5 的15:0执行
//Schedule().AndThen().ToRunEvery(1).Months().OnTheFirst(DayOfWeek.Friday).At(15, 0);
//每n月的第一个星期的星期5 的15:0执行 CleanJob和TestJob
//Schedule().AndThen().ToRunEvery(1).Months().OnTheFirst(DayOfWeek.Friday).At(15,0);
//在每天3点清理数据
Schedule().ToRunNow().AndEvery(10).Days().At(3, 00);
}
}
第二个类:
internal class CleanJob : IJob {
void IJob.Execute() {
string str =AppDomain.CurrentDomain.BaseDirectory + "Document\\Temp\\";
//获取项目运行目录+Document\Temp来获取临时目录的绝对路径
try {
//判读是否存在Temp目录
if (Directory.Exists(str)) {
//存在Temp目录,就删除所有的子目录和子文件
//获取指定目录中的子目录的名称(包括其路径)。
string[] directories = Directory.GetDirectories(str);//文件夹中可能不止一个文件
foreach (string directory in directories) {
//删除指定的目录并(如果指示)删除该目录中的所有子目录和文件。
Directory.Delete(directory, true);
}
//返回指定目录中文件的名称(包括其路径)。
string[] files =Directory.GetFiles(str);
foreach (string file in files)
{
File.Delete(file); // 删除指定的文件。
}
}
Else {
Directory.CreateDirectory(str); // 不存在,就创建Temp目录
}
}
catch (Exception e) {
Console.WriteLine(e);
}
}
}
定时任务写好了,要执行这个任务,在哪里请求执行呢?因为这个定时任务是一运行项目就要执行这个任务,所以把执行定时任务的方法写到整个项目的入口(Global.asax),其写法如下截图:
定时任务执行与停止方法:
public class FluentScheduler {
// 启动定时任务
//public static void StartUp()
{
// JobManager.Initialize(new MyRegistry());
//}
// 停止定时任务
//public static void Stop()
{
// JobManager.Stop();
//}
}