设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间01 现在时间01 缓存数据 当你走完一段之后回头看,你会发现,那些真正能被记得的事真的是没有多少,真正无法忘记的人屈指可数,真正有趣的日子不过是那么一些,而真正需要害怕的也是寥寥无几。

当你走完一段之后回头看,你会发现,那些真正能被记得的事真的是没有多少,真正无法忘记的人屈指可数,真正有趣的日子不过是那么一些,而真正需要害怕的也是寥寥无几。

查看: 1689|回复: 2

使用Hangfire+.NET 6实现定时任务管理(推荐)

[复制链接]

  离线 

TA的专栏

  • 打卡等级:热心大叔
  • 打卡总天数:228
  • 打卡月天数:0
  • 打卡总奖励:3404
  • 最近打卡:2025-11-23 05:45:23
等级头衔

等級:晓枫资讯-上等兵

在线时间
0 小时

积分成就
威望
0
贡献
426
主题
385
精华
0
金钱
4659
积分
869
注册时间
2023-1-3
最后登录
2025-11-23

发表于 2023-2-12 10:13:20 | 显示全部楼层 |阅读模式

在.NET开发生态中,我们以前开发定时任务都是用的Quartz.NET完成的。在这篇文章里,记录一下另一个很强大的定时任务框架的使用方法:Hangfire。两个框架各自都有特色和优势,可以根据参考文章里张队的那篇文章对两个框架的对比来进行选择。

引入Nuget包和配置

引入Hangfire相关的Nuget包:

  1. Hangfire.AspNetCore
  2. Hangfire.MemoryStorage
  3. Hangfire.Dashboard.Basic.Authentication
复制代码

并对Hangfire进行服务配置:

  1. builder.Services.AddHangfire(c =>
  2. {
  3. // 使用内存数据库演示,在实际使用中,会配置对应数据库连接,要保证该数据库要存在
  4. c.UseMemoryStorage();
  5. });
  6. // Hangfire全局配置
  7. GlobalConfiguration.Configuration
  8. .UseColouredConsoleLogProvider()
  9. .UseSerilogLogProvider()
  10. .UseMemoryStorage()
  11. .WithJobExpirationTimeout(TimeSpan.FromDays(7));
  12. // Hangfire服务器配置
  13. builder.Services.AddHangfireServer(options =>
  14. {
  15. options.HeartbeatInterval = TimeSpan.FromSeconds(10);
  16. });
复制代码

使用Hangfire中间件:

  1. // 添加Hangfire Dashboard
  2. app.UseHangfireDashboard();
  3. app.UseAuthorization();
  4. app.MapControllers();
  5. // 配置Hangfire Dashboard路径和权限控制
  6. app.MapHangfireDashboard("/hangfire", new DashboardOptions
  7. {
  8. AppPath = null,
  9. DashboardTitle = "Hangfire Dashboard Test",
  10. Authorization = new []
  11. {
  12. new HangfireCustomBasicAuthenticationFilter
  13. {
  14. User = app.Configuration.GetSection("HangfireCredentials:UserName").Value,
  15. Pass = app.Configuration.GetSection("HangfireCredentials:Password").Value
  16. }
  17. }
  18. });
复制代码

对应的配置如下:

  1. appsettings.json
复制代码
  1. "HangfireCredentials": {
  2. "UserName": "admin",
  3. "Password": "admin@123"
  4. }
复制代码

编写Job

Hangfire免费版本支持以下类型的定时任务:

  • 周期性定时任务:
    1. Recurring Job
    复制代码
  • 执行单次任务:
    1. Fire and Forget
    复制代码
  • 连续顺序执行任务:
    1. Continouus Job
    复制代码
  • 定时单次任务:
    1. Schedule Job
    复制代码

Fire and Forget

这种类型的任务一般是在应用程序启动的时候执行一次结束后不再重复执行,最简单的配置方法是这样的:

  1. using Hangfire;
  2. BackgroundJob.Enqueue(() => Console.WriteLine("Hello world from Hangfire with Fire and Forget job!"));
复制代码

Continuous Job

这种类型的任务一般是进行顺序型的任务执行调度,比如先完成任务A,结束后执行任务B:

  1. var jobId = BackgroundJob.Enqueue(() => Console.WriteLine("Hello world from Hangfire with Fire and Forget job!"));
  2. // Continuous Job, 通过指定上一个任务的Id来跟在上一个任务后执行
  3. BackgroundJob.ContinueJobWith(jobId, () => Console.WriteLine("Hello world from Hangfire using continuous job!"));
复制代码

Scehdule Job

这种类型的任务是用于在未来某个特定的时间点被激活运行的任务,也被叫做

  1. Delayed Job
复制代码

  1. var jobId = BackgroundJob.Enqueue(() => Console.WriteLine("Hello world from Hangfire with Fire and Forget job!"));
  2. // Continuous Job, 通过指定上一个任务的Id来跟在上一个任务后执行
  3. BackgroundJob.ContinueJobWith(jobId, () => Console.WriteLine("Hello world from Hangfire using continuous job!"));
复制代码

Recurring Job

这种类型的任务应该是我们最常使用的类型,使用Cron表达式来设定一个执行周期时间,每到设定时间就被激活执行一次。对于这种相对常见的场景,我们可以演示一下使用单独的类来封装任务逻辑:

  1. IJob.cs
复制代码

  1. namespace HelloHangfire;
  2. public interface IJob
  3. {
  4. public Task<bool> RunJob();
  5. }
复制代码

  1. Job.cs
复制代码

  1. using Serilog;
  2. namespace HelloHangfire;
  3. public class Job : IJob
  4. {
  5. public async Task<bool> RunJob()
  6. {
  7. Log.Information($"start time: {DateTime.Now}");
  8. // 模拟任务执行
  9. await Task.Delay(1000);
  10. Log.Information("Hello world from Hangfire in Recurring mode!");
  11. Log.Information($"stop time: {DateTime.Now}");
  12. return true;
  13. }
  14. }
复制代码

  1. Program.cs
复制代码
中使用Cron来注册任务:

  1. builder.Services.AddTransient<IJob, Job>();
  2. // ...
  3. var app = builder.Build();
  4. // ...
  5. var JobService = app.Services.GetRequiredService<IJob>();
  6. // Recurring job
  7. RecurringJob.AddOrUpdate("Run every minute", () => JobService.RunJob(), "* * * * *");
复制代码

Run

控制台输出:

  1. info: Hangfire.BackgroundJobServer[0]      Starting Hangfire Server using job storage: 'Hangfire.MemoryStorage.MemoryStorage'info: Hangfire.BackgroundJobServer[0]      Using the following options for Hangfire Server:          Worker count: 20          Listening queues: 'default'          Shutdown timeout: 00:00:15          Schedule polling interval: 00:00:15info: Hangfire.Server.BackgroundServerProcess[0]      Server b8d0de54-caee-4c5e-86f5-e79a47fad51f successfully announced in 11.1236 msinfo: Hangfire.Server.BackgroundServerProcess[0]      Server b8d0de54-caee-4c5e-86f5-e79a47fad51f is starting the registered dispatchers: ServerWatchdog, ServerJobCancellationWatcher, ExpirationManager, CountersAggregator, Worker, DelayedJobScheduler, RecurringJobScheduler...info: Hangfire.Server.BackgroundServerProcess[0]      Server b8d0de54-caee-4c5e-86f5-e79a47fad51f all the dispatchers startedHello world from Hangfire with Fire and Forget job!Hello world from Hangfire using continuous job!info: Microsoft.Hosting.Lifetime[14]      Now listening on: https://localhost:7295info: Microsoft.Hosting.Lifetime[14]      Now listening on: http://localhost:5121info: Microsoft.Hosting.Lifetime[0]      Application started. Press Ctrl+C to shut down.info: Microsoft.Hosting.Lifetime[0]      Hosting environment: Developmentinfo: Microsoft.Hosting.Lifetime[0]      Content root path: /Users/yu.li1/Projects/asinta/Net6Demo/HelloHangfire/HelloHangfire/[16:56:14 INF] start time: 02/25/2022 16:56:14[16:57:14 INF] start time: 02/25/2022 16:57:14[16:57:34 INF] Hello world from Hangfire in Recurring mode![16:57:34 INF] stop time: 02/25/2022 16:57:34
复制代码

通过配置的dashboard来查看所有的job运行的状况:

111335jppug2484v440064.jpeg

长时间运行任务的并发控制???

从上面的控制台日志可以看出来,使用Hangfire进行周期性任务触发的时候,如果执行时间大于执行的间隔周期,会产生任务的并发。如果我们不希望任务并发,可以在配置并发数量的时候配置成1,或者在任务内部去判断当前是否有相同的任务正在执行,如果有则停止继续执行。但是这样也无法避免由于执行时间过长导致的周期间隔不起作用的问题,比如我们希望不管在任务执行多久的情况下,前后两次激活都有一个固定的间隔时间,这样的实现方法我还没有试出来。有知道怎么做的小伙伴麻烦说一下经验。

Job Filter记录Job的全部事件

有的时候我们希望记录Job运行生命周期内的所有事件,可以参考官方文档:Using job filters来实现该需求。

参考文章

关于Hangfire更加详细和生产环境的使用,张队写过一篇文章:Hangfire项目实践分享。

到此这篇关于使用Hangfire+.NET 6实现定时任务管理的文章就介绍到这了,更多相关.NET 定时任务管理内容请搜索晓枫资讯以前的文章或继续浏览下面的相关文章希望大家以后多多支持晓枫资讯!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
18
积分
16
注册时间
2022-12-27
最后登录
2022-12-27

发表于 2024-8-2 01:51:53 | 显示全部楼层
路过,支持一下
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
19
积分
18
注册时间
2022-12-29
最后登录
2022-12-29

发表于 2025-4-11 21:31:12 | 显示全部楼层
感谢楼主分享。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1楼
2楼
3楼

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表