gpt4 book ai didi

c# - 尽管父作业成功,但Hangfire ContinueWithJob仍处于等待状态

转载 作者:行者123 更新时间:2023-12-03 16:16:27 25 4
gpt4 key购买 nike

我有一些作业是通过ContinueJobWith<MyHandler>(parentJobId, x => x.DoWork())一个接一个地执行的。
但是,第二项作业没有得到处理,始终处于Awaiting状态:
Parent is Succeeded, but job is not procssesed
工作本身是这样的:
Stuck in Enqueued
为什么会发生这种情况以及在哪里检查结果?

  • 我们将Autofac用作DI容器,但是我们有自己的JobActivator实现,因为我们必须处理 Multi-Tenancy 。
  • 我们正在使用SQL Server 2019进行存储。
  • Hangfire版本为1.7.10
  • 这是MVC 5应用程序
  • 我没有在任何日志中或调试
  • 时看到任何错误/异常
  • 通过this之后,我已将其添加到我们的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()));
    所有参数都是 intboolstring。如果我手动排队等待的作业,则它们将被顺利执行。
    我添加了Hangfire日志记录,但是在那里看不到任何问题:服务器启动,停止,作业更改状态,但是在那里看不到任何明显的错误。
    我应该考虑哪些其他事项,或者应该在哪里/如何进行调试?

    最佳答案

    从外观上看,ID为216348的第一个作业已成功完成,但ID为216349的第二个作业正在等待216347的父ID。根据Hangfire文档和经验,parentID应该是您在执行第二项作业之前等待完成的作业。
    根据Hangfire documentation on ContinueJobWith的说法,“当其父作业已完成时,将执行继续”。从您的屏幕截图中,尚不清楚JobID:216347发生了什么。一旦完成作业216347,ID为216349的作业便应开始。如果您期望216349完成后开始216348,请检查您的代码并确保将正确的ParentID传递给第二个作业。

    Update


    基于 on this thread,将 ContinuationsSupportAttribute添加到配置Hangfire服务的 GlobalJobFilters.Filter中。这应该使您的Hangfire实例知道继续作业。
    GlobalJobFilters.Filters.Add(new ContinuationsSupportAttribute());

    关于c# - 尽管父作业成功,但Hangfire ContinueWithJob仍处于等待状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62667339/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com