C# 在长时间运行的hangfire进程中发送心跳信号

C# 在长时间运行的hangfire进程中发送心跳信号,c#,.net-core,scheduled-tasks,hangfire,C#,.net Core,Scheduled Tasks,Hangfire,是否可以向hangfire(Redis存储)发送心跳信号,告知系统该进程仍处于活动状态?此时,我将InvisibilityTimeout设置为TimeSpan.MaxValue以防止hangfire重新启动作业。但是,如果进程失败或服务器重新启动,该作业将永远不会从正在运行的作业列表中删除。所以我的想法是,取消大的超时,而是发送一种心跳。这是可能的吗?我找到了解决如何在Hangfire中保持长期工作的方法。 上面说一旦你 […]正在点击hangfire的invisibilityTimeout。你

是否可以向hangfire(Redis存储)发送心跳信号,告知系统该进程仍处于活动状态?此时,我将
InvisibilityTimeout
设置为
TimeSpan.MaxValue
以防止hangfire重新启动作业。但是,如果进程失败或服务器重新启动,该作业将永远不会从正在运行的作业列表中删除。所以我的想法是,取消大的超时,而是发送一种心跳。这是可能的吗?

我找到了解决如何在Hangfire中保持长期工作的方法。 上面说一旦你

[…]正在点击hangfire的
invisibilityTimeout
。你有两个选择

  • 将超时时间增加到作业运行所需的时间
  • 让工作人员发出心跳,让hangfire知道它还活着
这对你来说并不新鲜。但有趣的是,接下来的问题是:

如何在工作中实现heartbeat

这仍然没有得到回答,这暗示你的问题真的不是微不足道的

我从未在Hangfire中处理过长期运行的工作,但我从其他排队系统(如)中了解到问题所在,这就是我对您的问题产生兴趣的原因

在过去的日子里,我对SunGrid有一个确切的问题,该部门的计算机专家告诉我,根据某种数学排队论,人们应该不惜一切代价避免长期运行的工作(我会尝试联系他,找到他引用的书的参考资料)。他的想法可能值得与您分享:

如果某个作业的运行时间超过了排队系统允许的最大运行时间,请不要提交作业本身,而是多次调用包装器脚本,该脚本能够(1)启动、(2)冻结停止、(3)解冻继续实际任务

此停止-继续实际上可以是操作系统级别的挂起(
CTRL+Z
在Linux中分别为
fg
),请参见例如

实际上,我使用了二进制
myMonteCarloExperiment.x
和包装器脚本
myMCjobStarter.sh
。我最大的计算时间是一天。我将用数百个包装器脚本调用填充队列,边界条件是每次只能运行一个。脚本将检查是否已经在计算集群的任何位置启动了进程
myMonteCarloExperiment.x
,如果没有,它将启动一个实例。如果有一个挂起的进程,包装器脚本将转发它并让它运行23小时55分钟,然后挂起该进程。在任何其他情况下,包装器脚本都会报告错误

这种方法没有实现作业心跳,但它确实运行了一个很长的作业。它还避免了必须清理Hangfire的作业日志,从而使队列管理员感到高兴

进一步参考
  • 看来这本书不错

当服务器重新启动时,是否有多个实例在运行?@jayasurya_j这是什么意思?我认为目前还没有,因为hangfire不知道该作业已死亡。我想编写一个永远侦听队列的作业(在无限循环中运行),我想将超时设置为maxvalue,但由于我使用BackgroundJob.Enqueue()。。在startup.cs中,我认为每次服务器启动或每次新部署发生时,我们都在排队等待一个永远运行的作业。所以不知道如何在hangfire中实现一个永久运行的作业。有什么想法吗?@jayasurya_j也有同样的问题,所以现在不是:)有可能在长时间运行的进程中使用后台作业。但是他们没有被安排。并且不显示在仪表板中。此外,从仪表板和服务器启动后启动也是不可能的。这是Hangfire上一个长期存在的漏洞。所以我不确定atm是否真的有一个好的解决方案。对我来说,我会重写工作,而不是一个永恒的循环,只是在完成后重新安排自己。