我们使用BackgroundJobServerOptions.WorkerCount = 1运行hangfire单线程(因为我们对订购处理有所需要)。
大多数情况下这没有问题,但偶尔会因为完全预期的原因(例如,它运行的实际代码进入infintite循环)而陷入困境,但是因为我们正在运行单线程,这会阻止其他工作队列从开始。
为了尝试解决这个问题,我们删除了该作业,但随后它停留在队列中,阻止任何其他作业启动:
我找到解决此问题的唯一方法是删除并重新创建一个显然不是很好的hangfire DB。
为什么在hangfire中删除正在运行的作业也不会将其从队列中删除?这个奇怪的删除行为是一个在以后的版本中修复的错误,还是因为我们运行单线程而设计的这种行为?
如果这是设计的,那么如何以一种将其从队列中删除的方式取消处理作业?
答案 0 :(得分:0)
似乎这种行为是设计的。
如果IIS应用程序池工作程序被回收,Hangfire将立即开始处理下一个任务。但是,如果没有这个重启,Hangfire将无限期地“挂起”。
github上提出了一个关于此事的问题,但尚未解决: https://github.com/HangfireIO/Hangfire/issues/80
由于无法取消或手动“失败”作业,这使得hangfire在单线程场景中的用处大打折扣。
更新:在一些更高版本的Hangfire中已经部分或完全解决了这个问题。