FluentScheduler
The job configuration is handled in a Registry class. A job is either an Action or a class that inherits IJob:
using FluentScheduler; public class MyRegistry : Registry
{
public MyRegistry()
{
// Schedule an IJob to run at an interval
Schedule<MyJob>().ToRunNow().AndEvery(2).Seconds(); // Schedule an IJob to run once, delayed by a specific time interval
Schedule<MyJob>().ToRunOnceIn(5).Seconds(); // Schedule a simple job to run at a specific time
Schedule(() => Console.WriteLine("It's 9:15 PM now.")).ToRunEvery(1).Days().At(21, 15); // Schedule a more complex action to run immediately and on an monthly interval
Schedule<MyComplexJob>().ToRunNow().AndEvery(1).Months().OnTheFirst(DayOfWeek.Monday).At(3, 0); // Schedule a job using a factory method and pass parameters to the constructor.
Schedule(() => new MyComplexJob("Foo", DateTime.Now)).ToRunNow().AndEvery(2).Seconds(); // Schedule multiple jobs to be run in a single schedule
Schedule<MyJob>().AndThen<MyOtherJob>().ToRunNow().AndEvery(5).Minutes();
}
}
You can also use the Registry class directly (instead of inheriting it):
var registry = new Registry();
registry.Schedule<MyJob>().ToRunNow().AndEvery(2).Seconds();
registry.Schedule<MyJob>().ToRunOnceIn(5).Seconds();
registry.Schedule(() => Console.WriteLine("It's 9:15 PM now.")).ToRunEvery(1).Days().At(21, 15);
registry.Schedule<MyComplexJob>().ToRunNow().AndEvery(1).Months().OnTheFirst(DayOfWeek.Monday).At(3, 0);
registry.Schedule<MyJob>().AndThen<MyOtherJob>().ToRunNow().AndEvery(5).Minutes();
With the registry ready you then need to initialize the JobManager. This is usually done as soon as your application is loaded (in the Application_Start method of a web application for example):
protected void Application_Start()
{
JobManager.Initialize(new MyRegistry());
}
It's also possible to schedule jobs after initialization:
JobManager.AddJob(() => Console.WriteLine("Late job!"), (s) => s.ToRunEvery(5).Seconds());
Using it with ASP.NET
When using it with ASP.NET consider implementing IRegisteredObject and registering it on HostingEnvironment (here's why), like:
public class SampleJob : IJob, IRegisteredObject
{
private readonly object _lock = new object(); private bool _shuttingDown; public SampleJob()
{
// Register this job with the hosting environment.
// Allows for a more graceful stop of the job, in the case of IIS shutting down.
HostingEnvironment.RegisterObject(this);
} public void Execute()
{
try
{
lock (_lock)
{
if (_shuttingDown)
return; // Do work, son!
}
}
finally
{
// Always unregister the job when done.
HostingEnvironment.UnregisterObject(this);
}
} public void Stop(bool immediate)
{
// Locking here will wait for the lock in Execute to be released until this code can continue.
lock (_lock)
{
_shuttingDown = true;
} HostingEnvironment.UnregisterObject(this);
}
}
Using it with .NET Core
FluentScheduler supports .NET Core, just add the dependency to project.json
and run dotnet restore
:
"dependencies": {
"FluentScheduler": "<desired version>"
}
Stopping the Scheduler
To stop the scheduler:
JobManager.Stop();
To both stop and wait for the running jobs to finish:
JobManager.StopAndBlock();
Unexpected exceptions
To observe unhandled exceptions from your scheduled jobs listen for the JobException event on JobManager:
JobManager.JobException += info => Log.Fatal("An error just happened with a scheduled job: " + info.Exception);
Concurrent jobs
By default, the library allows a schedule to run in parallel with a previously triggered execution of the same schedule.
If you don't want such behaviour you can set a specific schedule as non-reentrant:
public class MyRegistry : Registry
{
Schedule<MyJob>().NonReentrant().ToRunEvery(2).Seconds();
}
Or you can set it to all schedules of the registry at once:
public class MyRegistry : Registry
{
NonReentrantAsDefault();
Schedule<MyJob>().ToRunEvery(2).Seconds();
}
Daylight Saving Time
Unfortunately, not unlike many schedulers, there is no daylight saving time support yet.
If you are worried about your jobs not running or running twice due to that, the suggestion is to either avoid troublesome time ranges or to force the use of UTC:
JobManager.UseUtcTime();
Milliseconds Accuracy
The aim of the library is ease of use and flexibility, and not millisecond precision. While the library has a millisecond unit, you should avoid relying on really small intervals (less than 100ms).
Weekly jobs
Let's suppose it's 10:00 of a Monday morning and you want to start a job that runs every Monday at 14:00. Should the first run of your job be today or only on the next week Monday?
If you want the former (not waiting for a whole week):
// Every "zero" weeks
Schedule<MyJob>().ToRunEvery(0).Weeks().On(DayOfWeek.Monday).At(14, 0);
Or if you want the latter (making sure that at least one week has passed):
// Every "one" weeks
Schedule<MyJob>().ToRunEvery(1).Weeks().On(DayOfWeek.Monday).At(14, 0);
Dependency Injection
Currently, the library supports dependency injection of jobs (via IJobFactory). However, you shouldn't use it, it's on its way to be deprecated (here's why).
Contributing
Feel free to open an issue or to submit a pull request.
To make sure your pull request doesn't get rejected, discuss it in an issue beforehand. Also, remember to Run All Tests (Ctrl + R, A), Run Code Analysis on Solution (Alt + F11) and to be consistent with the existing code.
You can also help others in need for support, check the "help wanted" label.
// 立即执行计划任务,并根据指定时间间隔执行一次计划任务
//(指定一个时间间隔运行,根据自己需求,可以是秒、分、时、天、月、年等。)
Schedule().ToRunNow().AndEvery(10).Seconds();//每十秒运行一次
// 延迟一个指定时间间隔执行一次计划任务。
//(当然,这个间隔依然可以是秒、分、时、天、月、年等。)
Schedule().ToRunOnceIn(10).Seconds();
//在一个指定时间执行计划任务 每个小时的第10分钟执行
Schedule().ToRunEvery(1).Hours().At(46);
// 在一个指定时间执行计划任务(最常用。这里是在每天的下午 1:10 分执行) Schedule().ToRunEvery(1).Days().At(13,10);
//每n年的第几天
Schedule().ToRunEvery(1).Years().On(5).At(12, 00);
//每n年的最后一天
Schedule().ToRunEvery(1).Years().OnTheLastDay();
//每n月的第几天
Schedule().ToRunEvery(1).Months().On(1).At(12,0);
//每n月的第一个星期的星期5 的15:0执行Schedule().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);
最后还要在项目的Global.asax那注册定时任务
双击进出,在里面注册定时任务
FluentScheduler的更多相关文章
- C#定时任务组件之FluentScheduler
FluentScheduler是.NET开源处理定时任务组件 1.任务的创建注册 public static void TaskActionByMinutes(Action action, int c ...
- ASP.NET MVC 使用 FluentScheduler 定时器计划任务
MacBook Pro 只有四个 USB Type-C 接口是否错了? 一项新技术的诞生总会对已存在的事物造成冲击或影响,如果大家都害怕冲击与影响,那这个世界永远像现在不变就行了,大家都好好的,待在自 ...
- .NET定时任务执行管理器开源组件–FluentScheduler
在日常项目里通常会遇到定时执行任务的需求,也就是定时器..NET Framework里关于定时器的类有3个,分别是System.Windows.Forms.Timer.System.Timers.Ti ...
- 不用写Windows服务实现定时器功能(FluentScheduler )
MacBook Pro 只有四个 USB Type-C 接口是否错了? 一项新技术的诞生总会对已存在的事物造成冲击或影响,如果大家都害怕冲击与影响,那这个世界永远像现在不变就行了,大家都好好的,待在自 ...
- [转]推荐一个简单、轻量、功能非常强大的C#/ASP.NET定时任务执行管理器组件–FluentScheduler
在C#WINFORM或者是ASP.NET的WEB应用程序中,根据各种定时任务的需求,比如:每天的数据统计,每小时刷新系统缓存等等,这个时候我们得应用到定时器这个东东. .NET Framework有自 ...
- 推荐一个简单、轻量、功能非常强大的C#/ASP.NET定时任务执行管理器组件–FluentScheduler定时器
在C#WINFORM或者是ASP.NET的WEB应用程序中,根据各种定时任务的需求,比如:每天的数据统计,每小时刷新系统缓存等等,这个时候我们得应用到定时器这个东东. .NET Framework有自 ...
- 在吉日嘎拉DotNet.WebForm中使用FluentScheduler调度任务
有些用户一直说系统发送的邮件一直收不到,投诉系统不正常,这时候怎么洗刷冤屈呢?将发送的每一封Email都保存到数据库中,并记录发送的日志,让用户无话可说. 自己创建3个表: MessageFailed ...
- MVC 使用 FluentScheduler 定时器计划任务
MVC 使用 FluentScheduler 定时器计划任务 MacBook Pro 只有四个 USB Type-C 接口是否错了? 一项新技术的诞生总会对已存在的事物造成冲击或影响,如果大家都害怕冲 ...
- 【转】ASP.NET MVC 使用 FluentScheduler 定时器计划任务
MacBook Pro 只有四个 USB Type-C 接口是否错了? 一项新技术的诞生总会对已存在的事物造成冲击或影响,如果大家都害怕冲击与影响,那这个世界永远像现在不变就行了,大家都好好的,待在自 ...
- 定时任务FluentScheduler 学习笔记 .net
第一步添加引用 GitHub源码地址 与详细用法 https://github.com/fluentscheduler/FluentScheduler 下面开始简单的实现 /// <summar ...
随机推荐
- 启动IntelliJ IDEA 2016报错:cannot start under Java 1.7 : Java 1.8 or later is required 解决办法
idea64.exe启动错误:Cannot start under Java 1.7.0xxx IntelliJ IDEA : Unsupported java version Cannot star ...
- IC卡制作常识概述
ic卡主要有9种: 1.接触型IC卡: 2.非接触型IC卡: 3.串行传输型IC卡: 4.并行传输型IC卡: 5.存储型IC卡: 6.智能型IC卡: 7.超级 ...
- FastDFS tracker storage 的工作原理及流程
FastDFS tracker storage 的工作原理及流程 2013 年 3 月 11 日 – 09:22 | 1,409 views | 收藏 (No Ratings Yet) FastDF ...
- C#随机数字生成的一种方法
1.参考: public class RandomLongGenerater { public static long New(int bit) { ) { throw new Exception(& ...
- scala VS python2 (linux or shell)
PS:只考虑最新版的scala和python2.x,由于python3.x和python2.x区别比较大,而且主流的一些开源项目都用的python2,目前python2一点点在兼容python3 1. ...
- Aerospike系列:2:商业版和社区版的比较
http://www.aerospike.com/products-services
- Changing the Language Used in ODI Studio
odi.conf中加入区域和语言设置 修改 "$ODI_HOME\odi\studio\bin\odi.conf" ( D:\Oracle\Middleware\Oracle ...
- Java HmacSHA1算法
Java HmacSHA1算法 public static String hmacSha1(String src, String key) { try { SecretKeySpec signingK ...
- 获取公钥证书的DN(Distinguished Name)
DN -- Distinguished Name,证书持有人的唯一标识符. 可以通过下面的openssl命令来打印出证书的DN. openssl x509 -subject -nameopt RFC ...
- iOS UI01_Label
@implementation AppDelegate -(void)dealloc { [_window release]; [superdealloc]; } - (BOOL)applicatio ...