Skip to content

Hangfire

约 634 字大约 2 分钟

组件

2024-03-16

文档地址:https://docs.hangfire.io/en/latest/getting-started/index.html

HangFire类似Quartz.NET的任务组件,核心组件服务端客户端持久化存储,可与大多数.NET平台一起使用,客户端负责创建后台作业并将其保存到存储中。后台作业是应该在当前执行上下文之外执行的工作单元,例如在后台线程,其他进程中,甚至在不同的服务器上执行-借助Hangfire,即使没有其他配置,也可以实现所有工作。

  • 支持最小的周期单位为分钟
  • 持久化保存任务,还可在仪表盘中手动执行任务
  • 重试机制(注意:由于是持久化存储的,所有当你程序停止后没有删除任务,程序重新启动后 仍会尝试继续前面的任务)
  • 分布式部署
  • 可扩展性

组件:

  • HangFire 是程序包名称和主程序包,其中包括所有需要的依赖项.在这种情况下,此主程序包针对.NET框架.
  • HangFire.Core 是包含核心组件的程序包,该程序包的所有变体都可能依赖于这些组件.
  • HangFire.AspNetCore 是支持.NET Core的扩展 (Hangfire是持久化任务,所以还需要一个持久化扩展存储,sqlserver、mysql、redis等,会自动在库中创建表) ----- 安装报错可以手动创建数据库试试----!

.NET Core中使用: IIS8.0以下配置预加载比较麻烦 会由于回收机制导致任务停止运行 建议别用asp.net的形式 尽可能的使用服务

//Startup.cs 
//引入HangFire.AspNetCore、HangFire.PostgreSql
public void ConfigureServices(IServiceCollection services)
  {
            services.AddRazorPages();
            services.AddHangfire(o => 			     o.UsePostgreSqlStorage("DATABASE=Hangfire;HOST=localhost;PASSWORD=123456;USER   ID=postgres;PORT=5432;Pooling=true"));
  }


 public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
   			app.UseHangfireServer();
            app.UseHangfireDashboard(); // 访问"/hangfire" 使用仪表盘 可视化执行任务
            //即时执行,创建时执行仅一次
            BackgroundJob.Enqueue<SayHello>(job => job.Hello());
 
            //延迟执行,根据参数
            BackgroundJob.Schedule<SayHello>(jobs => jobs.DelayHello(), DateTimeOffset.UtcNow.AddMinutes(1));

            //周期性执行任务
            RecurringJob.AddOrUpdate<SayHello>("周期任务1",jobs=> jobs.loopHello(), Cron.Minutely());
    /*
     * 周期性任务也可以使用CRON表达式来配置 
     * Cron表达式:是由七子表达式组成,描述个别细节的时间表:秒 分钟 小时 日 月 星期 年(年可省略)
     * RecurringJob.AddOrUpdate(() => Console.Write("Hello!"), "0 */1 * * * ?"); //每分钟执行一
     *
     */
     
 }
public class SayHello
    {
        public void Hello()
        {
            Console.WriteLine("");
            Console.WriteLine($"{DateTime.Now},Hello");
        }


        public void DelayHello()
        {
            Console.WriteLine($"{DateTime.Now},Hello !!!");
        }

        public async Task loopHello()
        {
            Console.WriteLine($"{DateTime.Now},Hello World!!!");
        }

    }

结果:结果

仪表盘:image-20210409155333595