zoukankan      html  css  js  c++  java
  • 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那注册定时任务


    双击进出,在里面注册定时任务



  • 相关阅读:
    springboot自定义注解
    springboot2.3+mybatis+pageHelper
    免费好用的mysql客户端
    springboot2.3+mybatis-plus+mysql8.0
    b站“视频评论区”抽奖 讲解(含JS源码)
    JS实现b站动态抽奖“公平”方案——动态+转发
    JS实现b站动态转发抽奖(小人数)新方案讲解
    C#爬虫(Selenium和WeiAPI)
    C#时间戳转换
    Quartz.net配置文件出现的坑
  • 原文地址:https://www.cnblogs.com/Alex80/p/8891585.html
Copyright © 2011-2022 走看看