一、業務需求
平台首頁,有幾個指標統計,產品不要求實時性,覺得一天更新一次可以接受。
最后決定用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