网站优化网络推广seo,2小时学会php网站建设,长春关键词seo,百度竞价排名价格上一篇文章成功使用了Redis缓存数据#xff0c;大大提高博客的响应性能。接下来#xff0c;将完成一个任务调度中心#xff0c;关于定时任务有多种处理方式#xff0c;如果你的需求比较简单#xff0c;比如就是单纯的过多少时间循环执行某个操作#xff0c;可以直接使用.… 上一篇文章成功使用了Redis缓存数据大大提高博客的响应性能。接下来将完成一个任务调度中心关于定时任务有多种处理方式如果你的需求比较简单比如就是单纯的过多少时间循环执行某个操作可以直接使用.net core中内置的实现方式新建一个类继承BackgroundService实现ExecuteAsync()既可。看一个例子我们每过一秒输出一句HelloWorld并写入日志中。在.BackgroundJobs中新建一个Jobs文件夹添加HelloWorldJob.cs并且继承自BackgroundService。//HelloWorldJob.cs
using log4net;
using Microsoft.Extensions.Hosting;
using System;
using System.Threading;
using System.Threading.Tasks;namespace Meowv.Blog.BackgroundJobs.Jobs
{public class HelloWorldJob : BackgroundService{private readonly ILog _log;public HelloWorldJob(){_log LogManager.GetLogger(typeof(HelloWorldJob));}protected override async Task ExecuteAsync(CancellationToken stoppingToken){while (!stoppingToken.IsCancellationRequested){var msg $CurrentTime:{ DateTime.Now}, Hello World!;Console.WriteLine(msg);_log.Info(msg);await Task.Delay(1000, stoppingToken);}}}
}
然后在.HttpApi.Hosting层模块类中的ConfigureServices()注入context.Services.AddTransientIHostedService, HelloWorldJob();使用运行一下看看效果。可以看到已经成功输出了你可以在ExecuteAsync()中做你的事件处理逻辑。这应该是最简单后台定时任务处理了比较单一。在abp框架中官方给我们提供了许多后台工作的集成方式有兴趣的可以自行研究一下文档地址https://docs.abp.io/zh-Hans/abp/latest/Background-Jobs在本项目中我将使用 Hangfire 来完成定时任务处理为什么选择它呢因为简单开箱即用。下面进入正题可以先将 HelloWorldJob 停掉。在.BackgroundJobs中添加nuget包Volo.Abp.BackgroundJobs.HangFire、Hangfire.MySql.Core、Hangfire.Dashboard.BasicAuthorization、Volo.Abp.AspNetCore然后添加项目引用.Domain。在根目录新建模块类MeowvBlogBackgroundJobsModule.cs继承AbpModule依赖AbpBackgroundJobsHangfireModule。//MeowvBlogBackgroundJobsModule.cs
using Hangfire;
using Hangfire.MySql.Core;
using Meowv.Blog.Domain.Configurations;
using Meowv.Blog.Domain.Shared;
using Volo.Abp;
using Volo.Abp.BackgroundJobs.Hangfire;
using Volo.Abp.Modularity;namespace Meowv.Blog.BackgroundJobs
{[DependsOn(typeof(AbpBackgroundJobsHangfireModule))]public class MeowvBlogBackgroundJobsModule : AbpModule{public override void ConfigureServices(ServiceConfigurationContext context){context.Services.AddHangfire(config {config.UseStorage(new MySqlStorage(AppSettings.ConnectionStrings,new MySqlStorageOptions{TablePrefix MeowvBlogConsts.DbTablePrefix hangfire}));});}public override void OnApplicationInitialization(ApplicationInitializationContext context){var app context.GetApplicationBuilder();app.UseHangfireServer();app.UseHangfireDashboard();}}
}
在ConfigureServices()中添加配置因为之前选用了MySQL所以这里引用了Hangfire.MySql.Core这个包相对于的其它数据库可以在nuget上寻找。在new MySqlStorage()中配置连接字符串new MySqlStorageOptions()中配置表前缀Hangfire会在第一次运行时自动为我们创建表。然后在OnApplicationInitialization()中进行使用app.UseHangfireServer()必须调用如果你不需要界面显示可以不用app.UseHangfireDashboard();最后不要忘记在.HttpApi.Hosting层模块类中依赖定时任务模块MeowvBlogBackgroundJobsModule。现在运行一下项目打开地址.../hangfire 看看。数据库默认已经为我们创建了hangfire所需的表。有一个地方要注意就是在连接字符串中需要开启用户变量修改一下appsettings.json中的连接字符串在末尾添加Allow User VariablesTrue。同时在app.UseHangfireDashboard()中还支持很多配置项现在我们这个定时任务是公开的如果我们不想要外人访问可以开启BasicAuth。现在配置文件中配置Hangfire的登录账号和密码。...
Hangfire: {Login: meowv,Password: 123456
}
...
...
/// summary
/// Hangfire
/// /summary
public static class Hangfire
{public static string Login _config[Hangfire:Login];public static string Password _config[Hangfire:Password];
}
...
开启方式也很简单之前已经引用了Hangfire.Dashboard.BasicAuthorization这个包直接看代码。app.UseHangfireDashboard(options: new DashboardOptions
{Authorization new[]{new BasicAuthAuthorizationFilter(new BasicAuthAuthorizationFilterOptions{RequireSsl false,SslRedirect false,LoginCaseSensitive true,Users new []{new BasicAuthAuthorizationUser{Login AppSettings.Hangfire.Login,PasswordClear AppSettings.Hangfire.Password}}})},DashboardTitle 任务调度中心
});
app.UseHangfireDashboard()中可以自定义访问路径我们这里没有传就是用默认值。自定义界面的标题Title等等。更多参数可以自己看DashboardOptions结合情况来使用编译运行看看效果。现在就需要输入我们配置的账号密码才可以进入Hangfire界面了。这样我们就集成好了Hangfire并且还有了一个可视化的界面接下来我们同样实现一个简单的定时任务看看效果。在Jobs文件夹添加一个接口IBackgroundJob让他继承ITransientDependency实现依赖注入同时定义一个方法ExecuteAsync()。//IBackgroundJob.cs
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;namespace Meowv.Blog.BackgroundJobs.Jobs
{public interface IBackgroundJob : ITransientDependency{/// summary/// 执行任务/// /summary/// returns/returnsTask ExecuteAsync();}
}
在Jobs文件夹新建文件夹Hangfire添加HangfireTestJob.cs继承IBackgroundJob实现ExecuteAsync()方法。//HangfireTestJob.cs
using System;
using System.Threading.Tasks;namespace Meowv.Blog.BackgroundJobs.Jobs.Hangfire
{public class HangfireTestJob : IBackgroundJob{public async Task ExecuteAsync(){Console.WriteLine(定时任务测试);await Task.CompletedTask;}}
}
这样就完成了定时任务的逻辑我们怎么来调用呢新建一个扩展方法MeowvBlogBackgroundJobsExtensions.cs。//MeowvBlogBackgroundJobsExtensions.cs
using Hangfire;
using Meowv.Blog.BackgroundJobs.Jobs.Hangfire;
using Microsoft.Extensions.DependencyInjection;
using System;namespace Meowv.Blog.BackgroundJobs
{public static class MeowvBlogBackgroundJobsExtensions{public static void UseHangfireTest(this IServiceProvider service){var job service.GetServiceHangfireTestJob();RecurringJob.AddOrUpdate(定时任务测试, () job.ExecuteAsync(), CronType.Minute());}}
}
这里使用IServiceProvider解析服务获取到我们的实列所以我们可以在模块类中的OnApplicationInitialization(...)中直接调用此扩展方法。RecurringJob.AddOrUpdate()是定期作业按指定的计划触发任务同时还有Enqueue、Schedule、ContinueJobWith等等可以看一下Hangfire官方文档https://docs.hangfire.io/en/latest/CronType是自定义的一个静态类他帮我们自动生成了Cron表达式这里表示一分钟执行一次关于不懂Cron的同学可以去自学一下也许看看下面代码就懂了也有许多Cron表达式在线生成的工具。# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
*/30 * * * * /bin/python /qix/spider/spider.py #每30分钟执行一次
直接在根目录添加MeowvBlogCronType.cs。//MeowvBlogCronType.cs
using Hangfire;
using System;namespace Meowv.Blog.BackgroundJobs
{/// summary/// Cron类型/// /summarypublic static class CronType{/// summary/// 周期性为分钟的任务/// /summary/// param nameinterval执行周期的间隔默认为每分钟一次/param/// returns/returnspublic static string Minute(int interval 1){return 1 0/ interval.ToString() * * * ? ;}/// summary/// 周期性为小时的任务/// /summary/// param nameminute第几分钟开始默认为第一分钟/param/// param nameinterval执行周期的间隔默认为每小时一次/param/// returns/returnspublic static string Hour(int minute 1, int interval 1){return 1 minute 0/ interval.ToString() * * ? ;}/// summary/// 周期性为天的任务/// /summary/// param namehour第几小时开始默认从1点开始/param/// param nameminute第几分钟开始默认从第1分钟开始/param/// param nameinterval执行周期的间隔默认为每天一次/param/// returns/returnspublic static string Day(int hour 1, int minute 1, int interval 1){return 1 minute.ToString() hour.ToString() 1/ interval.ToString() * ? ;}/// summary/// 周期性为周的任务/// /summary/// param namedayOfWeek星期几开始默认从星期一点开始/param/// param namehour第几小时开始默认从1点开始/param/// param nameminute第几分钟开始默认从第1分钟开始/param/// returns/returnspublic static string Week(DayOfWeek dayOfWeek DayOfWeek.Monday, int hour 1, int minute 1){return Cron.Weekly(dayOfWeek, hour, minute);}/// summary/// 周期性为月的任务/// /summary/// param nameday几号开始默认从一号开始/param/// param namehour第几小时开始默认从1点开始/param/// param nameminute第几分钟开始默认从第1分钟开始/param/// returns/returnspublic static string Month(int day 1, int hour 1, int minute 1){return Cron.Monthly(day, hour, minute);}/// summary/// 周期性为年的任务/// /summary/// param namemonth几月开始默认从一月开始/param/// param nameday几号开始默认从一号开始/param/// param namehour第几小时开始默认从1点开始/param/// param nameminute第几分钟开始默认从第1分钟开始/param/// returns/returnspublic static string Year(int month 1, int day 1, int hour 1, int minute 1){return Cron.Yearly(month, day, hour, minute);}}
}
接着就可以调用定时任务了。//MeowvBlogBackgroundJobsModule.cs
...
public override void OnApplicationInitialization(ApplicationInitializationContext context)
{var app context.GetApplicationBuilder();...var service context.ServiceProvider;service.UseHangfireTest();
}
...
通过context.ServiceProvider可以获取到IServiceProvider然后直接调用扩展方法是不是超级简单现在编译运行项目看效果。关于任务是否真的运行成功我们可以从输出看出。完美本篇完成了Hangfire的集成并实现了一个定时任务计划有没有发现很简单你学会了吗????????????开源地址https://github.com/Meowv/Blog/tree/blog_tutorial