C#定時任務之FluentScheduler


一、業務需求

平台首頁,有幾個指標統計,產品不要求實時性,覺得一天更新一次可以接受。

最后決定用FluentScheduler定時執行統計,redis緩存結果。

每天晚上1點進行定時任務統計,將統計結果緩存到redis中,業務接口直接從reids里拿統計數據。

二、開始擼代碼

方式一:多個任務 + 不同時間段執行(這個沒有實現,大家可以使用 一個從0點開始的分鍾數,秒數等,自定義一個接口,根據規則去調用Schedule中的方法)

using System;
using System.Linq;
using System.Threading.Tasks;
using FluentScheduler;

namespace Common
{
    // 自己定義了一個接口,目前只有一個方法,大家可以根據自己的需求添加接口,比如定義一個執行任務的時間接口等
    public interface IScheduleTask
    {
        void Execute();
    }

    public class ScheduleTask : Registry
    {
        public ScheduleTask()
        { 
          // 獲取已加載到此應用程序域的執行上下文中的程序集(因為有延遲加載機制,
          // 未加載到應用程序域的時候會報錯,一般初始化的時候可能會再現問題)
          // var types = AppDomain.CurrentDomain.GetAssemblies()
          // .SelectMany(a => a.GetTypes()
          // .Where(t => t.GetInterfaces()
          // .Contains(typeof(IScheduleTask))))
          // .ToArray();
          var types = Assembly.GetAssembly(typeof(IScheduleTask)).GetTypes()
          .Where(t => t.GetInterfaces().Contains(typeof(IScheduleTask))).ToArray();
          foreach (Type type in types)
            {
                IScheduleTask obj = (IScheduleTask)Activator.CreateInstance(type);
                Task.Run(() =>
                {
                    //Schedule(() => obj.Execute()).ToRunNow().AndEvery(5).Seconds();// 每5秒執行一次
                    Schedule(() => obj.Execute()).ToRunEvery(1).Days().At(1, 0);// 每天晚上1點執行
                });
            }
        }
    }

    public class FirstJob : IScheduleTask
    {
        public void Execute()
        {
            new RedisHelper().StringSet($"FirstJob{ Guid.NewGuid().ToString()}", "FirstJob執行");// 模擬業務統計一
        }
    }

    public class SecondJob : IScheduleTask
    {
        public void Execute()
        {
            new RedisHelper().StringSet($"SecondJob{ Guid.NewGuid().ToString()}", "SecondJob執行");// 模擬業務統計二
        }
    }
}

Application_Start 方法添加  JobManager.Initialize(new ScheduleTask());
方式二:

using System;
namespace Test
{
    public class ThreeJob
    {
        public void Execute()
        {
            new RedisHelper().StringSet($"ThreeJob{ Guid.NewGuid().ToString()}", "ThreeJob執行");// 模擬業務統計三
        }
    }
}

Application_Start 方法添加  JobManager.AddJob(() => new ThreeJob().Execute(), t =>{t.ToRunNow().AndEvery(10).Seconds();});

方式三:實現IJob接口中的Execute方法

using System;
using System.Linq;
using System.Threading.Tasks;
using FluentScheduler;

namespace Test2
{
    public class ScheduleTask : Registry
    {
        public ScheduleTask()
        {
           //第二種調用業務方法:
           Schedule<FourJob>().ToRunNow().AndEvery(5).Seconds();
        }
    }

   
    public class FourJob : IJob
    {
        public void Execute()
        {
            new RedisHelper().StringSet($"FourJob{ Guid.NewGuid().ToString()}", "FourJob執行");// 模擬業務統計四
        }
    }
}

  Application_Start 方法添加  JobManager.Initialize(new ScheduleTask());

注意: 一般的程序池沒有經過特殊設置,一定閑置時間后,程序池會自動回收,導致定時任務不執行;解決辦法就是預加載,程序池回收后,模擬一次請求,進行初始化。

設置辦法可以參照: https://blog.csdn.net/y1535623813/article/details/76534614

https://www.jianshu.com/p/25d55249dce7


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM