Cron - 在线Cron表达式生成器 (ciding.cc)
/// <summary> /// Job工厂 /// </summary> public class JobFactory : IJobFactory { /// <summary> /// 容器提供器 /// </summary> private readonly IServiceProvider _serviceProvider; /// <summary> /// 构造函数 /// </summary> /// <param name="serviceProvider"></param> public JobFactory(IServiceProvider serviceProvider) { _serviceProvider = serviceProvider; } /// <summary> /// 返回IJob /// </summary> /// <param name="bundle"></param> /// <param name="scheduler"></param> /// <returns></returns> public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler) { Type jobType = bundle.JobDetail.JobType; return _serviceProvider.GetService(jobType) as IJob; } /// <summary> /// 清理销毁IJob /// </summary> /// <param name="job"></param> public void ReturnJob(IJob job) { var disposable = job as IDisposable; disposable?.Dispose(); } }
/// <summary> /// 启动定时调度任务 /// </summary> public class JobHostedService : IHostedService { private readonly IServiceProvider _provider; private readonly JobService _jobService; /// <summary> /// 构造函数 /// </summary> /// <param name="provider"></param> /// <param name="jobService"></param> public JobHostedService(IServiceProvider provider,JobService jobService) { _jobService = jobService; _provider = provider; } /// <summary> /// 执行定时任务 /// </summary> /// <param name="cancellationToken"></param> /// <returns></returns> public async Task StartAsync(CancellationToken cancellationToken) { var warnServices = Container.Resolve<ITBWarnBLL>(); List<TB_TasksQz> taskList = warnServices.GetWarnTasks(); Log4Helper.Log.WriteLog($"程序服务开始:{SerializationHelper.SerializeJson(taskList)}", null, JHSC.Log.ELogType.Info); foreach (var item in taskList) { try { var result = await _jobService.RunAsync(item); if (result) { Log4Helper.Log.WriteLog($"任务启动成功:{SerializationHelper.SerializeJson(item)}", null, JHSC.Log.ELogType.Info); } } catch (Exception ex) { Log4Helper.Log.WriteLog($"任务启动失败:{ex.Message}", ex, JHSC.Log.ELogType.Error); } } await StopAsync(cancellationToken); //在项目查询运行的时候运行一次 } /// <summary> /// 关闭任务 /// </summary> /// <param name="cancellationToken"></param> /// <returns></returns> public Task StopAsync(CancellationToken cancellationToken) { return Task.CompletedTask; } }
/// <summary> /// 任务调度服务,主要负责任务的运行和暂停 /// </summary> public class JobService { private readonly ISchedulerFactory _schedulerFactory; private readonly JobFactory _jobFactory; /// <summary> /// 构造函数 /// </summary> /// <param name="schedulerFactory"></param> /// <param name="jobFactory"></param> public JobService(ISchedulerFactory schedulerFactory, JobFactory jobFactory) { _schedulerFactory = schedulerFactory; _jobFactory = jobFactory; } /// <summary> /// 开始运行一个调度器 /// </summary> /// <param name="task"></param> /// <returns></returns> public async Task<bool> RunAsync(TB_TasksQz task) { //1、通过调度工厂获得调度器 var scheduler = await _schedulerFactory.GetScheduler(); //2、创建一个触发器 var trigger = JobTool.CreateTrigger(task); //3、创建任务 IJobDetail jobDetail = JobTool.CreateWarnJobDetail(task); //4、写入 Job 实例工厂 解决 Job 中取 ioc 对象 scheduler.JobFactory = _jobFactory; //5、将触发器和任务器绑定到调度器中 await scheduler.ScheduleJob(jobDetail, trigger); //6、开启调度器 await scheduler.Start(); return await Task.FromResult(true); } /// <summary> /// 关闭调度器 /// </summary> /// <param name="task"></param> /// <returns></returns> public async Task<bool> CloseAsync(TB_TasksQz task) { Log4Helper.Log.WriteLog($"关闭调度器 [{task.TaskId}_{task.JobGroup}]:", null, JHSC.Log.ELogType.Info); IScheduler scheduler = await _schedulerFactory.GetScheduler(); var jobKey = new JobKey(task.TaskId, task.JobGroup); if (jobKey == null) { Log4Helper.Log.WriteLog($"未找到任务 [{task.TaskId}_{task.JobGroup}]:", null, JHSC.Log.ELogType.Info); return false; } var triggers = await scheduler.GetTriggersOfJob(jobKey); var trigger = triggers?.Where(x => x.JobKey.Name == task.TaskId).FirstOrDefault(); if (trigger == null) { Log4Helper.Log.WriteLog($"未找到触发器 [{task.TaskId}_{task.JobGroup}]:", null, JHSC.Log.ELogType.Info); return false; } await scheduler.PauseTrigger(trigger.Key); await scheduler.UnscheduleJob(trigger.Key);// 移除触发器 await scheduler.DeleteJob(trigger.JobKey); Console.WriteLine("关闭成功:" + task.TaskId); return await Task.FromResult(true); } /// <summary> /// 暂停调度器 /// </summary> /// <param name="task"></param> /// <returns></returns> public async Task<bool> StopAsync(TB_TasksQz task) { Log4Helper.Log.WriteLog($"暂停调度器 [{task.TaskId}_{task.JobGroup}]:", null, JHSC.Log.ELogType.Info); IScheduler scheduler = await _schedulerFactory.GetScheduler(); var jobKey = new JobKey(task.TaskId, task.JobGroup); await scheduler.PauseJob(jobKey); return await Task.FromResult(true); } /// <summary> /// 恢复调度器 /// </summary> /// <param name="task"></param> /// <returns></returns> public async Task<bool> ResumeJob(TB_TasksQz task) { Log4Helper.Log.WriteLog($"暂停调度器 [{task.TaskId}_{task.JobGroup}]:", null, JHSC.Log.ELogType.Info); IScheduler scheduler = await _schedulerFactory.GetScheduler(); var jobKey = new JobKey(task.TaskId, task.JobGroup); var isExist = await scheduler.CheckExists(jobKey); if (!isExist) { Log4Helper.Log.WriteLog($"未找到任务 [{task.TaskId}_{task.JobGroup}]:", null, JHSC.Log.ELogType.Info); return false; } await scheduler.ResumeJob(jobKey); return await Task.FromResult(true); } /// <summary> /// 修改触发器 /// </summary> /// <param name="task"></param> /// <returns></returns> public async Task<bool> EditTrigger(TB_TasksQz task) { IScheduler scheduler = await _schedulerFactory.GetScheduler(); TriggerKey triggerKey = new TriggerKey(task.TaskId, task.JobGroup); ITrigger trigger = await scheduler.GetTrigger(triggerKey); if (trigger != null) { trigger = JobTool.CreateTrigger(task); await scheduler.RescheduleJob(triggerKey, trigger); } return await Task.FromResult(true); } }
/// <summary> /// 工具 /// </summary> public class JobTool { /// <summary> /// 创建SimpleTrigger触发器(简单触发器) /// </summary> /// <param name="tasksQz"></param> /// <returns></returns> public static ITrigger CreateTrigger(TB_TasksQz tasksQz) { if (tasksQz.BeginTime == null) { tasksQz.BeginTime = DateTime.Now; } if (tasksQz.EndTime == null) { tasksQz.EndTime = DateTime.Now.AddYears(1); } if (!string.IsNullOrEmpty(tasksQz.Cron)) { return CreateCronTrigger(tasksQz); } return CreateSimpleTrigger(tasksQz); } /// <summary> /// 创建任务 /// </summary> /// <param name="task"></param> /// <returns></returns> public static IJobDetail CreateWarnJobDetail(TB_TasksQz task) { var jobDetail = JobBuilder.Create<WarnJob>() .WithIdentity(task.TaskId, task.JobGroup) .Build(); jobDetail.JobDataMap.Add("JobParams", task.JobParams); return jobDetail; } /// <summary> /// 创建SimpleTrigger触发器(简单触发器) /// </summary> /// <param name="tasksQz"></param> /// <returns></returns> private static ITrigger CreateSimpleTrigger(TB_TasksQz tasksQz) { if (tasksQz.RunTimes > 0) { ITrigger trigger = TriggerBuilder.Create() .WithIdentity(tasksQz.TaskId, tasksQz.JobGroup) .StartAt(tasksQz.BeginTime.Value) .EndAt(tasksQz.EndTime.Value) .WithSimpleSchedule(x =>x.WithIntervalInSeconds(tasksQz.IntervalSecond) .WithRepeatCount(tasksQz.RunTimes)) .Build(); return trigger; } else { ITrigger trigger = TriggerBuilder.Create() .WithIdentity(tasksQz.TaskId, tasksQz.JobGroup) .StartAt(tasksQz.BeginTime.Value) .EndAt(tasksQz.EndTime.Value) .WithSimpleSchedule(x =>x.WithIntervalInSeconds(tasksQz.IntervalSecond) .RepeatForever()) .Build(); return trigger; } } /// <summary> /// 创建类型Cron的触发器 /// </summary> /// <param name="tasksQz"></param> /// <returns></returns> private static ITrigger CreateCronTrigger(TB_TasksQz tasksQz) { ITrigger trigger = TriggerBuilder.Create() .WithIdentity(tasksQz.TaskId, tasksQz.JobGroup) .StartAt(tasksQz.BeginTime.Value)//开始时间 .EndAt(tasksQz.EndTime.Value)//结束数据 .WithCronSchedule(tasksQz.Cron)//指定cron表达式 .Build(); return trigger; } }
/// <summary> /// 预警 /// </summary> [DisallowConcurrentExecution] public class WarnJob : IJob { /// <summary> /// 执行 /// </summary> /// <param name="context"></param> /// <returns></returns> public Task Execute(IJobExecutionContext context) { JobDataMap dataMap = context.JobDetail.JobDataMap; string jobParams = dataMap.GetString("JobParams"); if (!string.IsNullOrEmpty(jobParams)) { var warnServices = Container.Resolve<ITBWarnBLL>(); warnServices.RemindWarn(SerializationHelper.DeserializeJson<TB_Warn>(jobParams)); Log4Helper.Log.WriteLog($"任务执行完成:{jobParams}", null, JHSC.Log.ELogType.Info); } return Task.CompletedTask; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现