首页 > 解决方案 > Hangfire ContinueWithJob 卡在等待状态,尽管父作业已成功

问题描述

我有几个工作一个接一个地通过ContinueJobWith<MyHandler>(parentJobId, x => x.DoWork()).

但是,第二个作业没有得到处理,并且始终处于Awaiting以下状态: 父母成功,但工作未处理

工作本身是这样的: 卡在排队中

为什么会发生这种情况以及在哪里检查结果?

            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,boolstring。如果我手动将等待的作业排入队列,它们将毫无问题地执行。

我添加了 Hangfire 日志记录,但在那里看不到任何问题:服务器启动、停止、作业更改状态,但在那里看不到任何明显的错误。

我应该考虑哪些其他事情或者我应该在哪里/如何调试它?

标签: c#hangfire

解决方案


从外观上看,第一个 ID 作业216348成功完成,但您的第二个 ID 作业216349正在等待216347. 根据 Hangfire 文档和经验,parentID 应该是您在执行第二个作业之前等待完成的作业。

根据关于 ContinueJobWith 的 Hangfire 文档,“继续在其父作业完成时执行”。从您的屏幕截图中,不清楚 JobID: 发生了什么216347。一旦这项工作216347完成,带有 ID 的工作就216349应该开始了。如果您希望在完成216349后开始216348,请检查您的代码并确保将正确的 ParentID 传递给第二个作业。


更新

基于这个线程,添加ContinuationsSupportAttributeGlobalJobFilters.Filter你配置 Hangfire 服务的地方。这应该使您的 Hangfire 实例知道延续作业。

GlobalJobFilters.Filters.Add(new ContinuationsSupportAttribute());

推荐阅读