ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Hangfire

2021-12-16 16:31:48  阅读:161  来源: 互联网

标签:Console 后台作业 Hangfire new NET 执行


1. 概述

  • Hangfire是一个开源的.NET任务调度框架,提供了内置集成化的控制台,可以直观明了的查看作业调度情况,并且Hangfire不需要依赖于单独的应用程序执行(如:windows服务,window计划)
  • 支持持久性存储,开源且免费用于商业用途
  • Hangfire支持自动重试功能,后台作业执行过程中遇到问题,则会在延迟一段时间后自动重试

2. 基本特征和优点

基本特征和优点

3. 要求

  • Hangfire 适用于大多数 .NET 平台:.NET Framework 4.5 或更高版本、.NET Core 1.0 或更高版本,或与 .NET Standard 1.3 兼容的任何平台。您可以将其与几乎任何应用程序框架集成,包括 ASP.NET,ASP.NET Core,控制台应用程序,Windows服务,WCF以及社区驱动的框架,如Nancy或ServiceStack

4. 持久化

  • Hangfire将后台作业序列化并持久化到数据库中,服务宕机重启后正在执行的作业将被重新激活
  • 支持的数据库
    • SQLServer 2008R2以及更高版本,免费
    • PostgreSQL
    • MongoDB
    • Redis,收费

5. 后台作业类型

  • 单次执行
  • 延迟执行
  • 重复执行
  • 延续执行
  • 批量执行
  • 批量延续执行

6. 架构

  • Hangfire有三个主要部分组成:客户端、存储介质、服务端
    架构
    • 客户端:创建任务,将任务序列化后保存到指定的存储介质
    • 存储介质:负责持久化任务
    • 服务器:一个单独的后台线程从存储介质中获取并处理任务

7. 集成 Asp.Net Core Web API 并持久化到SQLServer

  • 安装NuGet包
    dotnet add package Hangfire.Core
    dotnet add package Hangfire.SqlServer
    dotnet add package Hangfire.AspNetCore
    
  • 配置Hangfire
    • 打开Startup.cs,在ConfigureServices方法中注册服务
      public void ConfigureServices(IServiceCollection services)
      {
          services.AddHangfire(configuration => configuration
          .SetDataCompatibilityLevel(CompatibilityLevel.Version_170)
          .UseSimpleAssemblyNameTypeSerializer()
          .UseRecommendedSerializerSettings()
          .UseSqlServerStorage(App.Configuration["ConnectionStrings:HangfireConnection"], new SqlServerStorageOptions
          {
              CommandBatchMaxTimeout = TimeSpan.FromMinutes(5),
              SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5),
              QueuePollInterval = TimeSpan.Zero,
              UseRecommendedIsolationLevel = true,
              DisableGlobalLocks = true
          }));
      
          services.AddHangfireServer();
      }
      
    • 在Configure方法中配置仪表盘
      app.UseHangfireDashboard("/hangfire", new DashboardOptions
      {
          Authorization = new[] { new DashboardAuthorizationFilter() },
          DashboardTitle = "Zheng He"
      });
      
    • 运行项目导航到/hangfire
  • 创建单次执行任务
    BackgroundJob.Enqueue(() => Console.WriteLine("Hello, world!"));
    
    • 该方法不会立即调用目标方法,而是运行以下步骤
      • 序列化方法信息及其所有参数
      • 根据序列化信息创建新的后台作业
      • 将后台作业保存到持久性存储
      • 将后台作业排队到其队列
      • 执行这些步骤后,该方法将立即返回给调用方。另一个Hangfire组件,称Hangfire Server,检查持久存储中排队的后台作业,并以可靠的方式执行它们
    • 排队作业由专用的工作线程池处理。每个工作线程调用以下进程
      • 获取下一个作业并将其隐藏起来
      • 执行作业及其所有扩展筛选器
      • 从队列中删除作业
    • 因此只有在处理成功后才会删除作业。即使某个进程在执行期间被终止,Hangfire 也会执行补偿逻辑,以保证每个作业的处理
  • 创建延迟执行任务
    BackgroundJob.Schedule(() => Console.WriteLine("Hello, world"),TimeSpanFromDays(1));
    
    • Hangfire Server会定期检查计划,以便将计划作业排队到其队列中,也可以通过控台手动触发。默认情况下定期检查的间隔15s,但可以通过在传递给构造器的选项上设SchedulePollingInterval属性来更改
      var options = new BackgroundJobServerOptions
      {
          SchedulePollingInterval = TimeSpan.FromMinutes(1)
      };
      var server = new BackgroundJobServer(options);
      
  • 创建重复执行任务
    RecurringJob.AddOrUpdate("easyjob", () => Console.Write("Easy!"), CronDaily);
    
  • 创建延续执行任务
    var jobId = BackgroundJob.Enqueue(() => Console.WriteLin("Fire-and-forget!"));
    //当上一个任务执行完成后,执行延续任务
    BackgroundJob.ContinueJobWith(jobId,() => Console.WriteLine("Continuation!");
    
  • 创建批量执行任务
    var batchId = Batch.StartNew(x =>
    {
        x.Enqueue(() => Console.WriteLine("Job 1"));
        x.Enqueue(() => Console.WriteLine("Job 2"));
    });
    
  • 创建批量延续执行任务
    Batch.ContinueBatchWith(batchId, x =>
    {
        x.Enqueue(() => Console.WriteLine("Last Job"));
    });
    

标签:Console,后台作业,Hangfire,new,NET,执行
来源: https://www.cnblogs.com/iservice/p/15698789.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有