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;
            }
        }
  • 相关阅读:
    451. Sort Characters By Frequency
    424. Longest Repeating Character Replacement
    68. Text Justification
    44. Wildcard Matching
    160. Intersection of Two Linked Lists
    24. Swap Nodes in Pairs
    93. 递归实现组合型枚举
    98. 分形之城
    97. 约数之和
    96. 奇怪的汉诺塔
  • 原文地址:https://www.cnblogs.com/netlock/p/14097300.html
Copyright © 2011-2022 走看看