zoukankan      html  css  js  c++  java
  • NET 5使用HangFire定时任务

    注意:
    1. 当Hangfire服务由Web程序来启用时,默认情况下,web应用程序中的Hangfire服务器实例在第一个用户访问您的站点之前不会启动。甚至,有一些事件会在一段时间后导致web应用程序关闭(比如空闲超时应用程序池回收事件)。在这些情况下, “循环任务”和“延迟作业”将不会进入队列,而“进入队列的作业”将不会被处理。因此我们需要让ASP.NET应用程序始终运行。(详见官方的方法:Making ASP.NET application always running)

    2. Hangfire Dashboard是一个你可以找到所有关于你的后台工作的信息的地方。它是作为一个OWIN中间件编写的(如果你不熟悉OWIN,也不用担心),所以你可以将它插入到你的 ASP.NET, ASP.NET MVC, Nancy, ServiceStack应用程序中,以及使用OWIN Self-Host 功能,在控制台应用程序或在Windows服务中托管Hangfire Dashboard服务。(详见官方说明: Using Dashboard)

    前言:
      定时任务调度问题,是一个老生常谈的问题。网上有许多定时任务调度的解决方案,对于我而言很早以前主要是使用Window计划和Window服务来做任务定时执行,然后就开始使用定时任务调度框架Quartz.Net。但是却一直没有上手过Hangfire这个自带后台任务调度面板,可以在后台手动执行任务的神奇的任务调度框架。前段时间终于开始对他下手了,通过在网上查阅了一些资料和查看了Hangfire在Github中的demo,终于在我自己的项目中用上了Hangfire。在该篇文章中主要简单介绍一下什么是Hangfire,Hangfire的基本特征与优点和分别使用MySQL,MS SQL Server作为存储使用。

    一、Hangfire是什么:

      hangfire官网https://www.hangfire.io/

      Hangfire是一个开源的.NET任务调度框架,提供了内置集成化的控制台,可以直观明了的查看作业调度情况,并且Hangfire不需要依赖于单独的应用程序执行(如:windows服务,window计划)。并且支持持久性存储。

    二、Hangfire使用条件:

    Hangfire与特定的.NET应用程序类型无关。您可以在ASP.NET Web应用程序,非ASP.NET Web应用程序,控制台应用程序或Windows服务中使用它。以下是要求:

    1.NET Framework 4.5

    2.永久存储(Hangfire将后台作业和其他与处理有关的信息保留在永久性存储器中,所以需要存储库来存储如:MS SQL Server,Redis,MySQL,PostgreSql等)

    3.Newtonsoft.Json库≥5.0.1

    三、Hangfire安装和使用:

    第一步:创建WebApi项目承载任务调度

    在ASP.NET 应用程序下使用Hangfire安装:

    Install-Package Hangfire (SQlServer内置)

    使用mysql作为存储时我们需要安装的NuGet:

    Install-Package Hangfire.MySql.Core

    修改appsettings.json配置文件,添加持久化作业数据的数据库连接

    <connectionStrings>
      <add name="sqlserver_connection" connectionString="Data Source=.;Initial Catalog=MyFirstDb;Integrated Security=True" providerName="System.Data.SqlClient" />
    </connectionStrings>

    第二步、创建作业业务类

    /// <summary>
        ///  疫情业务类
        /// </summary>
        public class DiseaseService : IDiseaseService
        {
            private IHttpClientFactory _httpClientFactory = null;
           // private DiseaseDataContext _diseaseDataContext = null;
            /// <summary>
            /// 
            /// </summary>
            /// <param name="httpClientFactory"></param>
            /// <param name="diseaseDataContext"></param>
            public DiseaseService(IHttpClientFactory httpClientFactory) //, DiseaseDataContext diseaseDataContext)
            {
                this._httpClientFactory = httpClientFactory;
                //_diseaseDataContext = diseaseDataContext;
            }
            /// <summary>
            /// 同步疫情
            /// </summary>
            /// <returns></returns> 
            public async Task<string> SyncDiseaseData()
            {
           //TODO同步疫情数据       return "";
            }

    第三步、在startup.cs中注入Hangfire

    ConfigureServices方法中添加

    services.AddHttpClient();  //注入HttpClient
                #region hangfire
                var storage = new MySqlStorage(Configuration.GetConnectionString("DiseaseJobConnection")
                      , new MySqlStorageOptions { PrepareSchemaIfNecessary = true, TablePrefix = "Disease" });
                //GlobalConfiguration.Configuration.UseStorage(new MySqlStorage(storage, new MySqlStorageOptions
                //{
                //    TransactionIsolationLevel = IsolationLevel.ReadCommitted, // 事务隔离级别。默认值为读提交。
                //    QueuePollInterval = TimeSpan.FromSeconds(15),             // 作业队列轮询间隔。默认值为15秒
                //    JobExpirationCheckInterval = TimeSpan.FromHours(1),       // 作业过期检查间隔(管理过期记录)。默认为1小时
                //    CountersAggregateInterval = TimeSpan.FromMinutes(5),      // 间隔到聚合计数器。默认为5分钟
                //    PrepareSchemaIfNecessary = true,                          // 如果设置为true,则创建数据库表。默认值为true
                //    DashboardJobListLimit = 50000,                            // 仪表板作业列表上限。默认值为50000 
                //    TransactionTimeout = TimeSpan.FromMinutes(1),             // 事务超时。默认为1分钟
                //}));   
                services.AddHangfire(p => p.UseStorage(storage));
                #endregion 
                services.AddScoped<DiseaseService>(); //注入业务

    在Configure方法中

    //hangfire
                app.UseHangfireServer();
                app.UseHangfireDashboard();
                //作业
                RecurringJob.AddOrUpdate<DiseaseService>("SyncDiseaseInformation", p => p.SyncDiseaseData(), "0 9,12,18,0 * * ?");

    运行程序后切换到hangfire管理页面如下图

     MS SQL Server的表

     常用命令

    //支持基于队列的任务处理:任务执行不是同步的,而是放到一个持久化队列中,以便马上把请求控制权返回给调用者。
    var jobId = BackgroundJob.Enqueue(()=>WriteLog("队列任务执行了!"));
     
    //延迟任务执行:不是马上调用方法,而是设定一个未来时间点再来执行,延迟作业仅执行一次
    var jobId = BackgroundJob.Schedule(()=>WriteLog("一天后的延迟任务执行了!"),TimeSpan .FromDays(1));//一天后执行该任务
     
    //循环任务执行:一行代码添加重复执行的任务,其内置了常见的时间循环模式,也可基于CRON表达式来设定复杂的模式。【用的比较的多】
    RecurringJob.AddOrUpdate(()=>WriteLog("每分钟执行任务!"), Cron.Minutely); //注意最小单位是分钟
     
    //延续性任务执行:类似于.NET中的Task,可以在第一个任务执行完之后紧接着再次执行另外的任务
    BackgroundJob.ContinueWith(jobId,()=>WriteLog("连续任务!"));

    配置权限

    app.UseHangfireServer();
                app.UseHangfireDashboard("/hangfire", new DashboardOptions
                {
                    Authorization = new[] { new HangfireAuthorizationFilter() },
                    IgnoreAntiforgeryToken = true,
                    AppPath = "/swagger/index.html",
                    DashboardTitle = "Abc Sys Hangfire Dashboard"
                });
                app.AddOrUpdateJobs();
    /// <summary>
        /// HangfireAuthorizationFilter
        /// </summary>
        public class HangfireAuthorizationFilter : IDashboardAuthorizationFilter
        {
            /// <summary>
            /// no authorize
            /// </summary>
            /// <param name="context"></param>
            /// <returns></returns>
            public bool Authorize(DashboardContext context)
            {
                return true;
            }
        }
  • 相关阅读:
    【转帖】Explorer参数详解
    获取html页面时如何选择合适的Encoding
    不要在wpf窗口类的构造函数中抛异常
    把FlvDownloader重构了一下
    VK Cup 2012 Qualification Round 1 A. Next Round
    迎接2012新赛季——HDOJ系列热身赛(2) Problem A HDU 4161 Iterated Difference
    青蛙过河~~~~
    VK Cup 2012 Qualification Round 1 D. Ice Sculptures
    HDU 1006 Tick and Tick
    ACM参赛总结
  • 原文地址:https://www.cnblogs.com/netlock/p/14097300.html
Copyright © 2011-2022 走看看