当前位置: 首页 > news >正文

Hangfire.HttpJob 日志与进度条可视化实战:任务执行过程在Dashboard上一览无余

Hangfire.HttpJob 日志与进度条可视化实战:任务执行过程在Dashboard上一览无余

【免费下载链接】Hangfire.HttpJobhttpjob for Hangfire,restful api for Hangfire,job调度与业务分离项目地址: https://gitcode.com/gh_mirrors/ha/Hangfire.HttpJob

Hangfire.HttpJob 是一个将"job调度与业务分离"的开源框架,它把 Hangfire 的作业调度能力封装成了 RESTful API,同时提供了一套日志与进度条可视化能力:无论任务运行在哪个 JobAgent 进程里,日志、错误、进度条都会实时回传并在 Dashboard 上一览无余。本文面向新手,带你用最短的时间看懂这套可视化机制,并跑通第一个带日志和进度条的任务。


🧭 为什么需要日志与进度条可视化?

传统分布式任务调度最常见的痛点就是"黑盒":任务失败了不知道卡在哪一步、日志散落在各个服务器、进度只能靠猜。Hangfire.HttpJob 通过Agent 模式解决了这个问题——业务代码写在独立的 Agent 进程里,执行过程中的每一条日志、每一个进度条更新,都会被收集并写入存储,最终呈现在 Hangfire Dashboard 的作业详情页上。

上图就是一个已经执行完成的 HttpJob 详情页:左侧能看到任务的完整执行代码,右侧状态区显示"Succeded"、耗时统计,下方的 Processing 区域则逐条展示 Agent 回传的执行日志(最后一行输出 "success"),整个执行过程完全透明。


📝 一行代码输出彩色日志:从 Agent 到 Dashboard

Hangfire.HttpJob 的日志可视化入口是JobContext.Console。在继承JobAgent的业务类里,通过jobContext.Console就能输出日志,而且支持颜色区分,方便在 Dashboard 上快速定位问题:

  • Console.Info(...):白色普通信息
  • Console.Warning(...):黄色警告
  • Console.Error(...):红色错误

日志的写入实现在 HangfireConsole.cs,每条日志都会被记录时间偏移量(TimeOffset),这样 Dashboard 上能按时间轴精确还原任务的执行节奏。你可以在 TestHangfireAgent 的 TestJob.cs 里看到最典型的三连调用:

jobContext.Console.Info("info消息"); jobContext.Console.Warning("waring消息"); jobContext.Console.Error("error消息");

日志回传与存储的完整链路涉及 ConsoleLine.cs(定义单条日志的结构:时间、内容、颜色、引用标记)和 ConsoleInfo.cs(记录存储用的 HashKey、SetKey 与任务开始时间)。


📊 进度条可视化:让长任务不再"假死"

对于耗时任务,用户最怕的是"不知道进度"。Hangfire.HttpJob 提供了与 Hangfire 官方一致的进度条 API——jobContext.Console.WriteProgressBar(name),返回一个进度条对象,用SetValue(0~100)即可实时更新:

var bar = jobContext.Console.WriteProgressBar("testbar"); for (int i = 0; i < 10; i++) { bar.SetValue(i * 10); // 每步更新10% await Task.Delay(1000); }

进度条的核心实现位于 HangfireProgressBar.cs:值域强制校验在 0~100 之间,只有值真正变化时才写入(避免无意义的存储写入)。配合 JobContext.cs 中提供的GetParameter<T>CancelToken等能力,你可以在长任务里实时汇报"第 N/M 步",也可以在用户手动取消时优雅退出。

通过 Dashboard 的"新增常规作业"弹窗,可以用 JSON 直接配置一个 HttpJob 的 URL、Method、Data、延迟分钟数、超时时间等参数;而 Agent 模式的任务则完全由代码控制日志与进度,两者在 Dashboard 上的呈现是统一的。


🔁 长驻任务日志:While 循环里也能持续回传

有些任务不是"执行一次就结束",而是持续运行的守护型任务(比如消费队列)。Hangfire.HttpJob 用[HangJobUntilStop]特性支持这种场景,参考 TestHangJob.cs:

[HangJobUntilStop(RegisterName = "HangJob测试")] public class TestHangJob : JobAgent { public override async Task OnStart(JobContext jobContext) { while (!jobContext.CancelToken.IsCancellationRequested) { jobContext.Console.Info("dddd"); await Task.Delay(1000 * 10); } jobContext.Console.Warning("game over"); } }

任务每 10 秒输出一条日志,全部实时可见;当用户在 Dashboard 上停止任务时,CancelToken会触发取消,循环退出后输出 "game over"。这就是"任务执行过程在 Dashboard 上一览无余"的典型长驻场景。

对于周期性任务,同样可以在 Dashboard 上配置 Cron 表达式,执行过程中的日志与进度条更新会与普通任务一样呈现在详情页中。


🗄️ 日志存哪里?五种存储后端随你选

日志与进度条数据不是随便丢的,而是写入你指定的存储。Hangfire.HttpJob.Agent 提供了多种现成实现,只需引入对应 NuGet 包并注册即可:

存储类型项目目录说明
MySQLHangfire.HttpJob.Agent.MysqlLogMysqlConsole 实现
MSSQLHangfire.HttpJob.Agent.MssqlConsoleSqlServer 存储
PostgreSQLHangfire.HttpJob.Agent.PostgreSqlConsole对应 PostgreSqlHangfire 测试工程
RedisHangfire.HttpJob.Agent.RedisConsoleRedisConsole 实现

Test 目录下有对应的完整可运行示例(如 TestHangfireAgent),照葫芦画瓢即可快速起一个带日志可视化的 Agent。


🚀 三步跑通你的第一个可视化任务

  1. 准备一个 Agent 项目:参考 TestHangfireAgent/Startup.cs,调用services.AddHangfireJobAgent()注册服务、app.UseHangfireJobAgent()挂载中间件。
  2. 写一个带日志和进度条的 Job:继承JobAgent,在OnStart里用jobContext.Console输出日志、用WriteProgressBar更新进度。
  3. 在 Dashboard 上执行并观察:创建作业(可参考 pic2、pic4 的 JSON 配置),执行完成后打开详情页,就能看到完整的彩色日志、进度条与耗时统计。


💡 小结

Hangfire.HttpJob 把"调度"和"业务"彻底分离:调度交给 Hangfire 服务端,业务跑在独立的 Agent 进程里,而日志与进度条可视化就是连接两端的透明窗口。对普通用户来说,你不需要关心底层存储的 HashKey、SetKey 是怎么组织的——只需要记住jobContext.Console这一个入口,就能让任务的每一步执行都清清楚楚地呈现在 Dashboard 上。

如果你正在为"任务黑盒"发愁,不妨用 Hangfire.HttpJob 的日志与进度条可视化能力,让每一次执行都有迹可循、一目了然。

【免费下载链接】Hangfire.HttpJobhttpjob for Hangfire,restful api for Hangfire,job调度与业务分离项目地址: https://gitcode.com/gh_mirrors/ha/Hangfire.HttpJob

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

http://www.cnnetsun.cn/news/4102002.html

相关文章:

  • Wand高级功能免费解锁,三步快速上手
  • 2026廊坊危房鉴定检测怎么选?老旧房危房鉴定靠谱机构 TOP 结构安全检测+ 报告可查 电话汇总
  • budgetzero测试体系解析:Jest单元测试与Cypress E2E实战
  • RISC-V Arduino Uno开发实战:CH32V103R与Embeetle IDE全解析
  • 海事铱星卫星电话天价账单解析:技术原理、计费陷阱与开发避坑指南
  • AE动态图形入门:零插件制作专业MG动画全流程实战
  • 云业务环境下凭证窃取攻击机理与分层防御策略研究
  • 生活化智能产品怎样保证工具链可复现
  • 开学季网络消费诈骗的生成机理与家庭防御路径研究
  • applera1n怎么用?零成本iOS激活锁绕过工具,4步解锁iOS 15-16.6旧iPhone
  • 零成本把 PC 游戏串流到客厅:Sunshine 自托管串流服务器 6 步上手实录
  • KOReader使用教程:从第一次安装到熟练阅读的完整路线
  • 多智能体协同修复框架MultiFixer:解决多段代码缺陷的工程实践
  • RT-Thread串口通讯实战:从裸机到多线程嵌入式系统开发
  • 【数据库】第三章 SQL
  • 基于Arduino与MAX7219的LED点阵Pong游戏实现
  • 前端诊断接口设计,先统一指标和版本
  • 基于Python的电影推荐系统的设计与实现(源码+文档+部署讲解等)
  • 从需求到实现:构建分层智能照明系统,提升工作坊效率与舒适度
  • 【Bug已解决】create_agent: model_to_tools router can return “model“ but path_map omits it -> KeyError(‘m…
  • B站成分检测器安装使用指南:3分钟让评论区每个账号的“成分“无处遁形
  • 【Windows 安装 Redis 图文解析附下载链接】Redis 的下载、配置、部署全流程保姆级操作教学
  • 【2026 最新附图文】Node.js 从下载安装、环境配置到全局运行保姆级教程(含常见问题说明)
  • 开源维护中的协作边界
  • 大语言模型与ROS 2融合:六足机器人智能决策与运动控制实践
  • 免费三国杀卡牌制作器实战指南:5分钟做出一张能打印的武将卡
  • 电子血压计拆解与维修指南:从结构解析到故障诊断
  • RS-232转以太网转换器:原理、配置与工业应用实战指南
  • 网络通信基石:IP地址、子网掩码、网关与DNS配置与排错全指南
  • 基于SpringBoot的宠物店管理系统的设计与实现毕业设计项目源码文档