【发布时间】:2019-11-28 23:44:09
【问题描述】:
一段时间以来,我一直遇到两个重复性作业(位于此列表顶部的作业)的问题,即使它们已安排好也无法运行。
我可以很好地触发它们,它们会被重新安排,但是当安排时间到来时,它们不会运行,“下一次执行”时间就会溜走。
现在还有很多其他工作也遇到了同样的问题。这些应该每小时运行一次,但如果它们超过了计划时间,它们就不会运行。
访问仪表板没有任何区别。 Web 应用程序始终处于打开状态。除非我手动触发它们,否则 Hangfire 永远不会运行这些作业。不处于这种状态的作业仍然可以每天或每小时按计划正常运行。
这是什么原因造成的?
我的 hangfire 实例(版本 1.7.6)位于设置为始终运行的 Azure WebApp 中。 它使用 Azure-sql 数据库作为其数据存储。
这是我的 Bootstrapper.cs 代码:
using System.Configuration;
using System.Web.Hosting;
using Hangfire;
namespace MyApi
{
public class HangfireBootstrapper : IRegisteredObject
{
public static readonly HangfireBootstrapper Instance = new HangfireBootstrapper();
private readonly object _lockObject = new object();
private bool _started;
private BackgroundJobServer _backgroundJobServer;
private HangfireBootstrapper()
{
}
public void Start()
{
lock (_lockObject)
{
if (_started) return;
_started = true;
HostingEnvironment.RegisterObject(this);
var jobOptions = new BackgroundJobServerOptions();
jobOptions.ServerName = ConfigurationManager.AppSettings.Get("hangfire:servername");
jobOptions.Queues = new[] {"k1"};
GlobalConfiguration.Configuration
.UseSqlServerStorage("Kdb");
_backgroundJobServer = new BackgroundJobServer(jobOptions);
}
}
public void Stop()
{
lock (_lockObject)
{
if (_backgroundJobServer != null)
{
_backgroundJobServer.Dispose();
}
HostingEnvironment.UnregisterObject(this);
}
}
void IRegisteredObject.Stop(bool immediate)
{
Stop();
}
}
}
以下是用于对大多数作业进行排队的代码:
jobMgr.AddOrUpdate($"Script.{i1}.{name}", Job.FromExpression(() => HangfireJobs.ReplayQueue.EnqueueScript(scriptId, i1, null)),cronExpression);
这是我的 EnqueueScript 方法的定义方式:
[Queue("k1")]
public static void EnqueueScript(Guid scriptId, int env, PerformContext context)
{
try
{
...
【问题讨论】:
-
您能否为我们提供一个最小设置来重现该问题?例如,您能给我们一些代码示例和您在 Azure 中用于运行 Hangfire 的设置吗?
-
@dylanT,有一些可能性。您能否从日志中确定作业运行的进程是否运行时间不超过下一次开始时间?例如,如果您计划在凌晨 1:05 启动 Job_A,它执行whatever.process.it.kicks.off.for.A ..但是...whatever.process.it.kicks.off.for。 A 直到凌晨 1:15 才完成。另一种可能性集中在围绕多租户构建的流程上。您知道您的流程是否适用于多租户?您是否使用多个具有相同作业名称的 hangfire 服务器?
-
否,作业的运行时间不会超过下一次开始时间。他们中的大多数都在 1 秒内完成。他们很快。我们在这个数据库上使用了两个 hangfire 服务器,但它们使用不同的队列。
-
@TikluGanguly 我希望能够重现这个问题,但我不知道是什么导致了这个问题。如果我给了我的配置机会,如果你尝试过,你就不会遇到这个问题。
-
我们所经历的似乎与其他人在github.com/HangfireIO/Hangfire/issues/1459 中谈论的完全一样,不知道为什么这从未出现在我之前的任何搜索中?