c# - Hangfire ContinueWithJob 卡在等待状态,尽管父作业已成功
问题描述
我有几个工作一个接一个地通过ContinueJobWith<MyHandler>(parentJobId, x => x.DoWork())
.
但是,第二个作业没有得到处理,并且始终处于Awaiting
以下状态:
为什么会发生这种情况以及在哪里检查结果?
- 我们使用 Autofac 作为 DI 容器,但我们有自己的
JobActivator
实现,因为我们必须处理多租户。 - 我们使用 SQL Server 2019 进行存储。
- Hangfire 版本是 1.7.10
- 这是 MVC 5 应用程序
- 我没有在任何日志中或在调试期间看到任何错误/异常
- 完成此操作后,我已将此添加到我们的 Autofac 注册中
builder.RegisterType<BackgroundJobStateChanger>()
.As<IBackgroundJobStateChanger>()
.InstancePerLifetimeScope();
这没什么区别。
这是作业的执行方式:
var parentJobId = _backgroundJobClient.Schedule<Handler>(h => h.ConvertCertToTraining(certId, command.SetUpOneToOneRelationship), TimeSpan.FromSeconds(1));
var filesCopyJObId = _backgroundJobClient.ContinueJobWith<Handler>(parentJobId, h => h.CopyAttachedFiles());
_backgroundJobClient.ContinueJobWith<Handler>(filesCopyJObId, h => h.NotifyUser(command.CertificationToBeConvertedIds, _principal.GetEmail()));
所有参数都是int
,bool
或string
。如果我手动将等待的作业排入队列,它们将毫无问题地执行。
我添加了 Hangfire 日志记录,但在那里看不到任何问题:服务器启动、停止、作业更改状态,但在那里看不到任何明显的错误。
我应该考虑哪些其他事情或者我应该在哪里/如何调试它?
解决方案
从外观上看,第一个 ID 作业216348
成功完成,但您的第二个 ID 作业216349
正在等待216347
. 根据 Hangfire 文档和经验,parentID 应该是您在执行第二个作业之前等待完成的作业。
根据关于 ContinueJobWith 的 Hangfire 文档,“继续在其父作业完成时执行”。从您的屏幕截图中,不清楚 JobID: 发生了什么216347
。一旦这项工作216347
完成,带有 ID 的工作就216349
应该开始了。如果您希望在完成216349
后开始216348
,请检查您的代码并确保将正确的 ParentID 传递给第二个作业。
更新
基于这个线程,添加ContinuationsSupportAttribute
到GlobalJobFilters.Filter
你配置 Hangfire 服务的地方。这应该使您的 Hangfire 实例知道延续作业。
GlobalJobFilters.Filters.Add(new ContinuationsSupportAttribute());
推荐阅读
- sql-server-2005 - 已开具发票的付款总额
- php - Laravel如何插入具有不同数据的多个复选框
- python - 如何连接 2 个 pytorch 模型并使第一个模型在 PyTorch 中不可训练
- spring-integration - 线接头作为异步通道?
- python - 如何使这条线更短
- spring-boot - JdbcCursorItemReader 的 RowMapper 中的结果集
- jmeter - 使用来自 csv 的 inpur 键值的终极线程组
- php - 在 php sql wordpress 之间使用变量
- powerbi - 如何在 PowerBI 中为每个类别的度量获取最大值
- c++ - 后对角线下的矩阵元素之和