比起Hangfire或者quartz来,FluentScheduler相对就简单得多,它只是提供了一个类库,提供任务调度的基本功能,没有像hangfire的数据库,web服务的依赖,功能变少,也更加简单了。非常适用于任务调度功能的集成。
netCore:
1、先建一个netcore的 job项目服务
2、nuget包安装: FluentScheduler
3、新建下面这两个class类
public class TestRegistry : Registry
{
/// <summary>
/// 服务注册(可以理解为:任务执行的计划策略)
/// </summary>
public TestRegistry()
{
//并行配置:
//方法一:.NonReentrantAsDefault()不允许并行执行,(任务每次需等待执行完成后,才能开启下一次的执行,防止并发执行带来的问题),
//方法二::同样的效果.NonReentrant()使用了,就不用NonReentrantAsDefault()了
NonReentrantAsDefault();//// Schedule an IJob to run at an interval
//// 立即执行,每5秒一次的计划任务。(指定一个时间间隔运行,根据自己需求,可以是秒、分、时、天、月、年等。)
Schedule<TestJob>().ToRunNow().AndEvery(5).Seconds();
//// 与上面这个一样,只不过加了,不能并行。其他的也可以使用 .NonReentrant()
//Schedule<TestJob>().NonReentrant().ToRunNow().AndEvery(5).Seconds();//在每天的21:15执行计划任务
//Schedule<TestJob>().ToRunEvery(1).Days().At(11, 33);//// 立即执行,一个在每月的第一个星期一 3:00 的计划任务
//Schedule<TestJob>().ToRunNow().AndEvery(1).Months().OnTheFirst(DayOfWeek.Monday).At(3, 0);////在每周一的21:15执行计划任务
//Schedule<TestJob>().ToRunEvery(1).Weeks().On(DayOfWeek.Monday).At(21, 15);}
}///job的具体操作
public class TestJob : IJob
{
public void Execute()
{
try
{//处理业务逻辑
Console.WriteLine("haha");
}
catch (Exception)
{
throw;
}
}
}
4、startup注册一下
AddFluentScheduler是自己写的扩展类,代码:
public static class ServiceCollectionExtensions
{
public static void AddFluentScheduler(this IServiceCollection serviceCollection)
{
//扫描当前程序集中实现(继承)了Registry的类,比如我们的 TestRegistry
//扫描当前程序集下面所有的自定义定时Job任务
var registry = Assembly.GetExecutingAssembly().GetTypes()
.Where(x => !x.IsInterface && !x.IsSealed && !x.IsAbstract && typeof(Registry).IsAssignableFrom(x))
.Select(x => x.Assembly.CreateInstance(x.FullName) as Registry)?.ToArray();//注册并同步服务
JobManager.Initialize(registry);
}
}
就是个批量扫描注册的扩展类,就不用一个一个注册了。
以上就完事了,也不需要数据库,只需要引用类库就可以做到定时任务。
NetFramework
跟上面core的搭建差不多,就是启动类和部署的问题(4-5)。
1、比如我创建个 framework4.5的空项目 (一样)
2、nuget包安装: FluentScheduler (一样)
3、新建下面这两个class类 (一样)
public class TestRegistry : Registry
{
/// <summary>
/// 服务注册(可以理解为:任务执行的计划策略)
/// </summary>
public TestRegistry()
{
//并行配置:
//方法一:.NonReentrantAsDefault()不允许并行执行,(任务每次需等待执行完成后,才能开启下一次的执行,防止并发执行带来的问题),
//方法二::同样的效果.NonReentrant()使用了,就不用NonReentrantAsDefault()了
NonReentrantAsDefault();//// Schedule an IJob to run at an interval
//// 立即执行,每5秒一次的计划任务。(指定一个时间间隔运行,根据自己需求,可以是秒、分、时、天、月、年等。)
Schedule<TestJob>().ToRunNow().AndEvery(5).Seconds();
//// 与上面这个一样,只不过加了,不能并行。其他的也可以使用 .NonReentrant()
//Schedule<TestJob>().NonReentrant().ToRunNow().AndEvery(5).Seconds();//在每天的21:15执行计划任务
//Schedule<TestJob>().ToRunEvery(1).Days().At(11, 33);//// 立即执行,一个在每月的第一个星期一 3:00 的计划任务
//Schedule<TestJob>().ToRunNow().AndEvery(1).Months().OnTheFirst(DayOfWeek.Monday).At(3, 0);////在每周一的21:15执行计划任务
//Schedule<TestJob>().ToRunEvery(1).Weeks().On(DayOfWeek.Monday).At(21, 15);}
}///job的具体操作
public class TestJob : IJob
{
public void Execute()
{
try
{//处理业务逻辑
Console.WriteLine("haha");
}
catch (Exception)
{
throw;
}
}
}
4、这里不一样,netframework因为没有启动类startup,那就加个Global.asax启动类 (如果网站已经建立就不会看到此项目,一个Web网站只能拥有一个Global.asax文件)
5、然后在global的Application_Start里面注册就行了
6、上面就算可以了,但是netframework项目一般是部署在iis上面,这样就会出现一个问题,iis的程序池长时间不访问就会回收。我这边是这么处理的:再每次结束的时候再请求一次网站地址
或者可自行百度其他方法,我看了别的什么iis程序池回收的时候再请求一次网站、预加载什么的方法其实也都可以,因为我懒所以就写上面的代码了。