五一网站个人空间,做短视频网站收益,教育类网站 前置审批,可以编辑图片的wordpress这两天的新闻也是越来越多了#xff0c;不仅Github接手了NPM#xff0c;还有.NET 5也要新鲜出炉了#xff08;11月正式发布#xff09;#xff0c;当然还有MVP峰会也正在如火如荼的展开#xff0c;会有哪些好的东西被碰撞出来#xff0c;也是很期待的。这些天我也简单的… 这两天的新闻也是越来越多了不仅Github接手了NPM还有.NET 5也要新鲜出炉了11月正式发布当然还有MVP峰会也正在如火如荼的展开会有哪些好的东西被碰撞出来也是很期待的。这些天我也简单的开始了学习之路网路一直不好直播也就不好展开但是肯定会有的应该过不了多久所以暂时通过文字来讲解吧。BCVP也就是Blog.Core和Vue的全家桶项目开源一年多我也一直在开发和维护目标呢也一直致力于打造一个开箱即用的丰富小框架目前的核心功能如下也算是完成了九层了吧剩下的10%属于锦上添花的功能一般小项目可能用不上但是中型项目是必须要用的今天的重点就是说说作业调度Quzrtz.net目前已经集成到了项目里为了不影响Master分支目前代码在is4分支上感兴趣的小伙伴可以自行PULL下来看看目前的效果是这样的下篇文章会集成到Blog.Admin项目中。任务调度展示可持久化到数据库本文重点参考Kawhi代码自己做了调整【壹起学】1Uwl.Admin开源框架基于QuartzNet的实现这个系列我打算写三篇文章和一篇视频的形式文章分为后端、前端、原理三篇视频就是总体串一下今天就是第一篇简单说说后端的配置和操作不讲原理。为什么要使用Quartz.Net关于Quartz.Net的概念、内容和工作原理UML这都不说了相信你如果看到了这个文章标题并点进来了应该知道这是干啥的也应该知道他的应用场景——任务调度白话就是通过一定的简单配置定时去执行一些任务多见于统计和同步操作。这里简单的贴一下它Github的数据就足可见受欢迎度(我一直认为好的开源项目要看Closed了多少Issue)其实本来我的项目中已经有了一套任务执行程序用的还是微软的自带的HostingService用起来是特别简单几乎不用配置只需要创建一个Service然后直接写逻辑就行了它会随着我们的运行的项目一起执行如果说你的任务调度很简单就是定时跑一个小方法我还是比较推荐这个的当然这个也是有很多问题比如不能手动动态配置不能手动控制任务的启动、暂停、重启等多个操作所以应群友的号召我就把.net中用的较多的Quzrtz给集成到了项目里当然还有一个Hangfire也很流行我目前公司老的项目中是用的这个Hangfire但是我感觉有些臃肿了不太应景NetCore这么优雅的高效框架。后端如何配置Quartz.Net01创建任务数据库表以及四层服务既然我们要动态配置到数据库里那肯定就需要一个数据库表结构了这个过程就是很简单的了得益于我们有强大的Seed功能无论是是CodeFirst生成数据库表结构还是根据表结构利用FrameSeed生成四层文件都很简单。首先是创建实体类然后生成到数据库中我已经配置好了 /// summary/// 任务计划表/// /summarypublic class TasksQz : RootEntity{/// summary/// 任务名称/// /summary[SugarColumn(ColumnDataType nvarchar, Length 200, IsNullable true)]public string Name { get; set; }/// summary/// 任务分组/// /summary[SugarColumn(ColumnDataType nvarchar, Length 200, IsNullable true)]public string JobGroup { get; set; }/// summary/// 任务运行时间表达式/// /summary[SugarColumn(ColumnDataType nvarchar, Length 200, IsNullable true)]public string Cron { get; set; }/// summary/// 任务所在DLL对应的程序集名称/// /summary[SugarColumn(ColumnDataType nvarchar, Length 200, IsNullable true)]public string AssemblyName { get; set; }/// summary/// 任务所在类/// /summary[SugarColumn(ColumnDataType nvarchar, Length 200, IsNullable true)]public string ClassName { get; set; }/// summary/// 任务描述/// /summarypublic string Remark { get; set; }/// summary/// 执行次数/// /summarypublic int RunTimes { get; set; }/// summary/// 开始时间/// /summarypublic DateTime? BeginTime { get; set; }/// summary/// 结束时间/// /summarypublic DateTime? EndTime { get; set; }/// summary/// 触发器类型0、simple 1、cron/// /summarypublic int TriggerType { get; set; }/// summary/// 执行间隔时间, 秒为单位/// /summarypublic int IntervalSecond { get; set; }/// summary/// 是否启动/// /summarypublic bool IsStart { get; set; } false;/// summary/// 执行传参/// /summarypublic string JobParams { get; set; }[SugarColumn(IsNullable true)]public bool? IsDeleted { get; set; }/// summary/// 创建时间/// /summary[SugarColumn(IsNullable true)]public DateTime CreateTime { get; set; } DateTime.Now;}然后SeedData到数据库然后配置种子数据[{Name: 博客管理,JobGroup: 博客测试组,Cron: ,AssemblyName: Blog.Core.Tasks,ClassName: Job_Blogs_Quartz,Remark: ,RunTimes: 0,BeginTime: ,EndTime: ,TriggerType: 0,//0是simple模式1的cron模式IntervalSecond: 120,//2分钟执行一次IsStart: true,JobParams: 1,IsDeleted: false,CreateTime: \/Date(15462720000000800)\/,Id: 1}
]启动项目自动SeedData生成到数据库后然后我们就需要生成四层服务文件因为我们的Blog.Core项目已经封装了代码生成器还是两个你可以用T4也可以用DbFirstController.cs这个控制器方法只需要FrameSeed.cs文件中配置上表名就行了最后可以创建一个控制器对这个表进行CURD操作不赘述。核心要说的还是我们的任务调度中心。02创建任务调度服务中心当然首先我们需要引用Nuget包// 在Blog.Core.Tasks 层安装
PackageReference IncludeQuartz Version3.0.7 /
新建QuartzNet文件夹创建调度服务接口和实现类具体的原理我会在第三篇简单说下namespace Blog.Core.Tasks
{/// summary/// 服务调度接口/// /summarypublic interface ISchedulerCenter{/// summary/// 开启任务调度/// /summary/// returns/returnsTaskMessageModelstring StartScheduleAsync();/// summary/// 停止任务调度/// /summary/// returns/returnsTaskMessageModelstring StopScheduleAsync();/// summary/// 添加/// /summary/// param namesysSchedule/param/// returns/returnsTaskMessageModelstring AddScheduleJobAsync(TasksQz sysSchedule);/// summary/// 停止一个任务/// /summary/// param namesysSchedule/param/// returns/returnsTaskMessageModelstring StopScheduleJobAsync(TasksQz sysSchedule);/// summary/// 恢复一个任务/// /summary/// param namesysSchedule/param/// returns/returnsTaskMessageModelstring ResumeJob(TasksQz sysSchedule);}
}
主要就是利用IScheduler对Job进行处理核心的逻辑和代码都在实现类类今天暂时先不进行讲解具体的可以查看SchedulerCenterServer.cs配置好了服务以及调度中心接下来就是创建一个个Job类了。03创建Job工作顾名思义我们要想实现任务调度就需要创建很多个Job工作类让调度中心自己根据相应的逻辑机制来去调度我这里创建了一个简单的Job作为示例namespace Blog.Core.Tasks
{public class Job_Blogs_Quartz : JobBase, IJob{private readonly IBlogArticleServices _blogArticleServices;private readonly ITasksQzServices _tasksQzServices;public Job_Blogs_Quartz(IBlogArticleServices blogArticleServices, ITasksQzServices tasksQzServices){_blogArticleServices blogArticleServices;_tasksQzServices tasksQzServices;}public async Task Execute(IJobExecutionContext context){var executeLog await ExecuteJob(context, async () await Run(context));//var param context.MergedJobDataMap;// 可以直接获取 JobDetail 的值var jobKey context.JobDetail.Key;var jobId jobKey.Name;// 也可以通过数据库配置获取传递过来的参数JobDataMap data context.JobDetail.JobDataMap;//int jobId data.GetInt(JobParam);var model await _tasksQzServices.QueryById(jobId);if (model ! null){model.RunTimes 1;model.Remark ${executeLog}br /;await _tasksQzServices.Update(model);}}public async Task Run(IJobExecutionContext context){var list await _blogArticleServices.Query();await Console.Out.WriteLineAsync(博客总数量 list.Count.ToString());}}
}
通过接口调用这个就很简单了毕竟我们前后端分离要通过接口的形式来对我们的任务进行调度这里简单的列举一个就行了 /// summary/// 启动计划任务/// /summary/// param namejobId/param/// returns/returns[HttpGet]public async TaskMessageModelstring StartJob(int jobId){var data new MessageModelstring();// 获取任务服务var model await _tasksQzServices.QueryById(jobId);// 开启jobvar ResuleModel await _schedulerCenter.AddScheduleJobAsync(model);if (ResuleModel.success){model.IsStart true;data.success await _tasksQzServices.Update(model);}if (data.success){data.msg 启动成功;data.response jobId.ObjToString();}return data;}最后的最后不要忘记把相应的服务和接口进行注册好啦关于后端如何配置任务调度Quzrtz.Net就暂时说到这里了下篇简单说下如何在前端配置页面吧这两天我先设计着。