在后台中调用方法
优质
小牛编辑
136浏览
2023-12-01
Fire-and-forget 的调用方法极其简单。正如您从 快速开始 一节中了解到,您只需要传递一个具有相应方法和参数的lambda表达式:
BackgroundJob.Enqueue(() => Console.WriteLine("Hello, world!"));
Enqueue
方法不会立即调用目标方法,而是运行以下步骤:
- 序列化目标方法及其所有参数。
- 根据序列化的信息创建一个新的后台任务。
- 将后台任务保存到持久化存储。
- 将后台任务入队。
执行这些步骤后, BackgroundJob.Enqueue
方法立即返回结果。轮到另一个Hangfire组件,Hangfire Server 将会从持久化存储中检查到队列中有后台任务后如期执行。
队列任务由专门的工作线程处理。每个worker将如下述流程执行任务:
- 获取一个任务,并对其他 worker 隐藏该任务。
- 执行任务及其所有的扩展过滤器。
- 从队列中删除该任务。
因此,只有处理成功后才能删除该任务。即使一个进程在执行期间被终止,Hangfire将执行补偿逻辑来保证每个任务都被处理。
每种持久存储各有各自的步骤和补偿逻辑机制:
- SQL Server 使用常规 SQL 事务,因此在进程终止的情况下,后台作业 ID 立即放回队列。
- MSMQ 使用事务队列,因此不需要定期检查。入队后几乎立即获取作业。
- Redis 实现使用阻塞的
BRPOPLPUSH
命令,因此与 MSMQ 一样立即获取作业。但是在进程终止的情况下,只有在超时到期后(默认为 30 分钟)才重新排队。